静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


python

scikit-learnのSVMを自分で計算したカーネルで使う

はじめに 多くの機械学習手法では入力される特徴量はベクトルで表されますが、ベクトルとして表現するのが難しい情報もあります。そのような場合でも、個体間の類似度さえ計算できれば機械学習を使えるというケースがあります。これが世にいうカーネル法です…

【python】正規表現モジュールreで行頭・行末にマッチしないときの対処

概要 pythonの正規表現モジュールreでは、デフォルトでは^は「文字列の先頭」に、$は「文字列の末尾」にマッチします。 なので、次のような挙動になります。 >>> s = "hoge\nfuga\n" >>> import re >>> re.findall(r"^[hf]|[ea]$", s) ['h', 'a'] # ['h', 'e…

ロジスティック回帰で特徴語を抽出する

はじめに 線形判別分析など、線形の判別モデルは係数を使って各クラスに重要な特徴を取り出すことができます。 今回はロジスティック回帰を使って、20newsgroupsのデータセットから各クラスの特徴語を取り出してみます。 実験 以下のようなコードを走らせま…

SVMのsupport vectorを可視化してみた

はじめに SVMはヒンジ関数を使ってマージン最大化を行い、境界付近のデータに基づいて分離超平面を決定する……ということはよく言われています。でも、実際のデータで確認している図はあまり見たことがありません。 sklearnのSVMのドキュメントを読んでいたら…

【python】ロジスティック回帰で確率値で学習させる

はじめに ロジスティック回帰は回帰という名前なのにほとんど二項判別に使われますが、たまに本当に回帰に使うときもあります。0.1とか0.4とか0.6のような目的変数を使ってモデルを作る、というケースです。 ちょっとした目的で必要になるかもしれないと思っ…

scikit-learnのColumnTransformerを使ってみる

はじめに ColumnTransformerを使うと、列ごと(特徴量ごと)に異なった操作を適用するという変換を行うことができます。 ドキュメントを読んでいてそのうち必要になりそうだと思ったので、理解を深めるために記事を書いておきます。 はじめに 使い方 使って…

【python】ファイルのwritelinesは行を書いてくれない

はじめに 使ったことがないので知らなかったのですが、表題の通りwritelinesは行を書いてくれません。 実験 次のようなコードを書きます。test_writelines.py lst = ["hoge", "fuga", "piyo"] with open("test.txt", "w") as f: f.writelines(lst) 粛々と実…

多次元尺度構成法(MDS)で文字列の編集距離を可視化してみる

はじめに ベクトルとして表現するのが難しいけど、個体間の距離(非類似度)は定義できる……というデータがたまにあります。こういうとき、多次元尺度構成法を使うと可視化がうまくいきます。 ということで、編集距離を可視化してみようと思います。 データ h…

今あえて書く、目的別Pythonを使うメリット・デメリット

はじめに ここ数年間、日本国内のPython事情は急速に変わったと思います。私が使い始めた4年前と比べても、ずいぶん垢抜けた感じになったというのが正直な感想です。 Python2からPython3への移行が(ようやく)進み、扱いやすくなった ライブラリも良いもの…

決定木をいろいろな方法で可視化する

はじめに 決定木はデータが分類される過程がわかりやすいことから、可視化に向いています。特にサンプル数が少なく、データの特徴量の次元数が少ないようなケースではかなり直感的な結果が得られます。 決定木の可視化では、原理的には単に図を描いて可視化…

TypeError: '***' object is not subscriptableの対処法

はじめに Pythonを始めてからしばらく時間が経って、ある程度自力で複雑なプログラムを書くようになると、タイトルのようなエラーに遭遇することが多いと思います。 このエラーが出たときは、たいていはロジックに問題があります。一概に通用する対処法がな…

sklearn.tree.plot_treeをJupyter Notebookで使うと決定木の可視化が捗る・・・かな? matplotlibでできるよ

はじめに sklearnでは様々な方法で決定木を可視化できるのですが、これまでの方法ではそのためにはgraphvizを介する必要がありました。これは面倒くさく、トラブルの原因にもなりやすいものでした。 scikit-learn 0.21以降ではmatplotlibでプロットしてくれ…

ランダムフォレスト回帰で過学習を抑制

はじめに ランダムフォレストは分類にも回帰にも使えます。今回は回帰を取り扱います。 ランダムフォレストの厄介なところは、決定木なので油断すると過学習しまくるところです。これは分類でも問題になりますが、回帰の場合は更に問題です。ということで、…

sklearnのtrain_test_splitを使うときはstratifyを指定した方が良い

はじめに train_test_splitはsklearnをはじめて学んだ頃からよくお世話になっています。しかし、stratifyを指定しないとまずいことが起こり得ると最近気づきました。 stratifyって何? 層化という言葉を聞いたことがある方が一定数いると思いますが、それで…

ランダムフォレストはサンプル数が多いとメモリ消費量が大きい

はじめに 表題の通りなのですが、サンプル数が多いデータに対してランダムフォレストを使うと思いの外メモリを食います。 また、ストレージにダンプしようとすると、ストレージ容量も消費します。 現象 なにはともあれやってみましょう。 import pickle from…

sklearnとmatplotlibでiris(3クラス)の予測確率を可視化した話

はじめに よく分類器の性質などを把握するために、2次元で可視化している図があります。 特に予測確率なんかを平面的に出せるとかっこいいですよね。つまり、こういうのです。Classifier comparison — scikit-learn 0.21.3 documentation以前の記事より君はK…

ランダムフォレストで分類するときの過学習対策の検討

はじめに ランダムフォレストは決定木のアンサンブル学習なので、何も考えずに使うと過学習します。過学習対策はいろいろあるので(木の深さだったり、ノードあたりのサンプル数による制御だったり)、やってみます。 まあ、その過学習した状態の方が性能良…

君はKNN(k nearest neighbor)の本当のすごさを知らない

はじめに KNNといえば機械学習入門書の最初の方に載っている、わかりやすいけど性能はいまいちな初心者向けの手法という認識の人も多いと思います。 しかし、本当はけっこう優秀なのです。 2次元で予測させてみる 予測させます。コードは軽く読み流して結果…

【python】高次元の分離境界をなんとか2次元で見る

はじめに 分類器の特性を把握するために2次元データで分離境界を見るということが行われがちですが、高次元空間における分離器の特性を正確に表している訳ではありません。 ということがずっと気になっていたので、なんとか高次元空間で分類させて2次元で見…

matplotlibのpcolormeshでalphaを小さくすると網目が出てくる対策

概要 デフォルト設定だとタイトルに書いた通りの現象が起こります。網目模様が出て図が汚くなります。 実験 こんな単純なコード。 import numpy as np import matplotlib.pyplot as plt def main(): xx, yy = np.meshgrid(np.arange(0, 10, 0.1), np.arange(…

【python】statsmodelsでt検定する方法

statsmodelsは統計処理に特化したPythonのライブラリです。statsmodelsを使うと、t検定を簡単に行うことができます。この記事ではその方法を説明します。

【python】setのandとorには要注意

setに対して積集合・和集合を計算したいときがあると思うのですが、うっかりand, orを使ってしまうとひどい目に遭います。Pythonでは集合の演算にはビット演算子の&, |などを使用します。

【python】scipyでt検定する方法まとめ

t検定の中でもよく使われるのが2群の標本の平均に差異があるかどうかの検定です。t検定はscipyを使うと簡単に実施することができます。その方法を紹介します。

emacsでpythonを書くための設定 2019年版

概要 emacsライトユーザーの私が、新規環境にemacs25を導入してpythonを書くにあたってやった設定を書いておきます。目的はpythonを書くことだけです。 前提として、以下の記事のように環境を作っています(読まなくてもなんとかなります)。Ubuntu 18.04 LT…

【python】sklearnのfetch_20newsgroupsで文書分類を試す(5)

はじめに ずっと放置していたシリーズですが、その後新たに得られた知見が出てきたので、更新しておこうと思います。 得られた知見 いろいろ勉強した結果、以下のような考えに至りました。 そもそもデータ数が多いので、高級な分類器であればあるほど速度的…

【python】PCAと非負値行列因子分解のバイプロットを見比べる

はじめに 非負値行列因子分解は負の値が出現しないような行列に対して行える分解で、主成分分析とか因子分析に似ています。 参考: 非負値行列因子分解(NMF)をふわっと理解する - Qiita 上の記事によると、いいところとしては、 非負なので現実のデータに…

nan同士の同値性比較はFalseになる

nanをイコールで比較しようとしてもうまくいきません。nanはなにと比較しても(自分同士の比較でも)Falseになるような性質を持っているからです。 >>> import numpy as np >>> np.nan == np.nan False pythonに限らず、おそらく大半のプログラミング言語で…

scikit-learnのモデルに疎行列(csr_matrix)を渡したときの速度

はじめに sklearnのモデルには疎行列を取れるものもたくさんありますが、この場合速度差があったりするのでしょうか。 いろいろなデータとモデルで検証を行ってみました。 目次 はじめに 実験1:digitsを分類させてみる 実験2:多項ナイーブベイズについても…

【python・ネタ】exit()ではなくexitで終了できるexitコマンドを作る

概要 むしゃくしゃして書いた。冷静に考えたら疲れてた。 問題点 >>> exit Use exit() or Ctrl-Z plus Return to exit ウザい! exitで落ちるようにしたい! 実装 簡単に書けます。5行くらい。 import sys class Exit: def __repr__(self): sys.exit() exit …

Ubuntu 18.04 LTSにvenvでミニマムなPython3.7仮想環境を構築

概要 まっさらなパソコンを開発環境として立ち上げることになり、表題の通りのことをやる必要があったのでまとめておきます。 venvを使うつもりなので、作業量としては少ないはずです。 Python3.7の導入 Ubuntu 18.04はデフォルトでpython2が導入されていま…