静かなる名辞

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

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



python

【python】sklearnでQuadraticDiscriminantAnalysis(二次判別分析)を試す

はじめに 線形判別分析は非線形な分布に対応できないのでだいたいイマイチなパフォーマンスになるのですが、QDA(二次判別分析)だと若干緩和されます。 二次判別分析はその名の通り分離境界が二次関数になります。ということは、非線形性はありますが、大し…

TypeError: list indices must be integers or slices, not ***等の原因と対処法

はじめに pythonを触り始めたばかりの人は、よくこんなエラーに遭遇すると思います。 TypeError: list indices must be integers or slices, not *** ***の部分はfloatだったりlistだったりstrだったりといろいろありますが、とにかくこんなエラーです。 ま…

sklearnで正則化回帰(Ridge, Lasso, ElasticNet)するときはCV付きのモデルがいいよ

はじめに 正則化回帰は割と定番のモデルなのですが、sklearnのAPIリファレンスをよく見ると、CVが末尾についたモデルがあることがわかります。 Lasso→LassoCV Ridge→RidgeCV ElasticNet→ElasticNetCV API Reference — scikit-learn 0.21.2 documentation な…

【python】相関係数行列をstatsmodelsを使って描く

はじめに 相関係数行列を描く方法としては、pandasとseabornを使う方法などが一般的です。しかし、statsmodelsで行う方法も実は存在します。pandas+seabornでやる場合 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seabo…

pythonで相関係数を計算する方法いろいろ3種類

はじめに pythonで相関係数を計算する方法はいろいろあります。確認したら、主要ライブラリだけで3つありました。 いろいろあるということは用途によって使い分けられるということなので、淡々と書いていきます。 なお、念のために断っておくと、ここで書い…

Pythonプロセスの自分自身のメモリ使用量を調べる

簡単なテストや処理をしているとき、Pythonプロセス自身のメモリ消費量を計算したくなるときがある。やり方を知らなかったけど、頑張って検索したら出てきたのでメモ。 import os import psutil process = psutil.Process(os.getpid()) print(process.memory…

nltkでテキストを文・センテンス単位で分割する

概要 自然言語処理やテキストマイニングをしていると文単位で処理・分析したいということはたまにあるので、テキスト(複数文)→センテンス(単一の文)という変換をしたくなることがあります。 英語の場合は、nltkを使うと簡単です。 nltk.sent_tokenizeで…

指数関数を二次多項式で近似してみる

はじめに 指数関数って右半分の形だけなら、二次関数になんとなく似ていますよね。二次多項式を持ってくれば近似的にできそうな気ができるので、やってみましょう。 とはだいたい同じようなものじゃないの? という話です。 プログラム pythonのscipyを使い…

numpyでnanを含む配列の同値性をちゃんと計算する

はじめに 2つのnumpy配列が同一であるかどうか調べたいシチュエーションは、ままあるでしょう。 で、こうする訳です。 >>> import numpy as np >>> a = np.array([1,2,3]) >>> b = np.array([1,2,3]) >>> (a == b).all() True すべての要素同士を比較して、…

sklearnの変数選択は疎行列型(csr_matrix)でやると速いっぽいよ

はじめに 疎行列はメモリ消費こそ少ないものの、scikit-learnで使うと内部でnumpy配列に変換されたりしてあまり恩恵を受けられないことが多いです。 でも、変数選択に使うときはどうやら効くっぽいです。 関連記事 www.haya-programming.com 実験 淡々とやり…

scikit-learnで目的変数を対数変換したりするTransformedTargetRegressor

はじめに 経済系の分析などで、目的変数を対数変換して分析するというケースがあります。scikit-learnはそのようなケースもサポートしています。 どうやったらいいのかわからなくて、自分で変数を変換している人も中にはいるかと思いますが、モデル構築まで…

scikit-learnのPolynomialFeaturesで多項式と交互作用項の特徴量を作る

はじめに 回帰などで非線形の効果を取り扱いたいとき、多項式回帰は定番の方法です。また、交互作用項も使うと有用なときがあります。 pythonユーザはいきなりSVRやランダムフォレスト回帰などの非線形回帰を使うことが多い気もしますが、線形モデルでも特徴…

sklearnのKFoldやStratifiedKFoldでrandom_stateを変えても結果が変わらないとき

はじめに random_stateを設定して「結果を固定したい」ことはよくありますが、「結果を変えたい」ってあんまりないですよね。いろいろな条件下で比較して検定するときくらいでしょうか。 それでも、変わるだろうなと思って変えたら変わらなくて困るというパ…

非線形がなんだ! ロジスティック回帰+多項式でやってやる!

はじめに ロジスティック回帰はいうまでもなく線形分類器です。www.haya-programming.com しかし、特徴量を非線形変換したり、交互作用項を入れたりして使えば、非線形の問題にも十分使えます。参考: 交互作用項を入れればロジスティック回帰でも非線形分離…

カーネルPCAで文字列の編集距離を可視化してみる

はじめに 以前に編集距離が計算された文字列間の位置関係をMDSを使ってまったく同じことをしましたが、今度はカーネルPCAでやってみます。 違いとしては、MDSは距離行列から計算を行うのに対してカーネルPCAは類似度行列から計算を行えるということがあると…

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で使うと決定木の可視化が捗る・・・かな?

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

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

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

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

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

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

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