静かなる名辞

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

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



機械学習

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

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

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

はじめに 非負値行列因子分解は負の値が出現しないような行列に対して行える分解で、主成分分析とか因子分析に似ています。 参考: qiita.com 上の記事によると、いいところとしては、 非負なので現実のデータに向く 非負なので解釈が楽 さらにスパースにな…

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

はじめに sklearnのモデルには疎行列を取れるものもたくさんありますが、この場合速度差があったりするのでしょうか。 ごく簡単に検証してみます。 実験1 簡単のためにdigitsを使います。分類器は SVC RandomForestClassifier MultinomialNB GradientBoostin…

AdaBoostとRandomForestの比較

はじめに 個人的にAdaBoostの性質がまだよくわかっていないので、比較を行ってみようと思います。 参考文献 大元はsklearnのこの記事です。scikit-learn.org また、コードを1から書き上げるほどの情熱が今回沸かなかったので、自分の過去記事からコピペして…

【python】sklearnのAdaBoostをデフォルトパラメータで使ってはいけない

はじめに sklearnのAdaBoostを使う機会がありましたが、デフォルトパラメータのまま使ってみたら性能が悪すぎて驚きました。 対策を書きます。 症状 何も考えずに使うとこんな感じです。 from sklearn.datasets import load_digits from sklearn.ensemble im…

【python】sklearnのRandomizedSearchCVを使ってみる

はじめに RandomizedSearchCVなるものがあるということを知ったので、使ってみます。うまく使うとグリッドサーチよりよい結果を生むかもしれないということです。sklearn.model_selection.RandomizedSearchCV — scikit-learn 0.20.3 documentation 比較実験 …

本当は怖いSVMと交差検証

概要 SVMと交差検証を組み合わせて使うと、たとえ交差検証で高いスコアが出て汎化性能確保できた! と思っても想像とかけ離れた分離超平面になっていることがままある。 なのでこの組み合わせは少し怖いということを説明する。 コード irisを分類します。二…

【python】sklearnのOneClassSVMを使って外れ値検知してみる

はじめに OneClassSVMというものがあると知ったので使ってみます。 「1クラスSVM?」と思われると思いますが、要するに異常検知・外れ値検出などで使う手法です。信頼区間を出すのに似ていますが、複雑な分布だったりそもそも分布が想定できないようなデータ…

【python】sklearnのFeatureAgglomerationを使ってみる

はじめに FeatureAgglomerationは階層的クラスタリングを用いた教師なし次元削減のモデルです。特徴量に対して階層的クラスタリングを行い(つまり通常のサンプルに対するクラスタリングと縦横の向きが入れ替わる)、似ている特徴量同士をマージします。マー…

【python】sklearnのRFE(Recursive Feature Elimination)を使ってみる

はじめに RFE(Recursive Feature Elimination)というものがあることを知ったので試してみたいと思いました。 RFEは特徴選択の手法で、その名の通り再帰的にモデルを再構築しながら特徴を選択するという特色があります。sklearn.feature_selection.RFE — scik…

決定木回帰、ランダムフォレスト回帰、SVRを可視化してみた

はじめに 最近回帰モデルで遊んでいるのですが、決定木系の回帰に好印象が持てなくなりました。 だって、決定木ってオーバーフィット番長ですよ? 回帰とは名ばかりのカクカクの回帰曲線が出てくることは目に見えています。 「そんなあなたのためにランダム…

【python】sklearnのRidgeとLassoを使ってみる

はじめに Rdige、Lassoといえば割と定番の正則化アルゴリズムです。 特にLassoはスパースな解を得てくれるという触れ込みです。なんだかカッコいいので、昔から触ってみたいと思っていました。 そこで簡単な関数で回帰を行い、どれくらい効果的か試してみま…

【python】線形な分類器の比較

はじめに 線形な分類器は癒やし やれ、RBFカーネルだ、決定木だ、ニューラルネットだ、深層学習だ、と流行り物に乗っかって、言うことを聞かない非線形な分類器をなんとかねじ伏せている私たちは、きっと心が荒んでいるのでしょう。 そんな私たちに、線形分…

【python】ランダムフォレストのOOBエラーが役に立つか確認

はじめに RandomForestではOOBエラー(Out-of-bag error、OOB estimate、OOB誤り率)を見ることができます。交差検証と同様に汎化性能を見れます。 原理の説明とかは他に譲るのですが、これはちゃんと交差検証のように使えるのでしょうか? もちろん原理的に…

【python】GridSearchCV『の』パラメータ・チューニング

はじめに 機械学習でパラメータ・チューニングをしたい場合、グリッドサーチを行うのが定石とされています。sklearnではグリッドサーチはGridSearchCVで行うことができます。sklearn.model_selection.GridSearchCV — scikit-learn 0.20.1 documentation それ…

【python】sklearnのVarianceThresholdを試してみる

はじめに VarianceThresholdは名前の通り、分散がしきい値以下の特徴量を捨てます。sklearn.feature_selection.VarianceThreshold — scikit-learn 0.20.2 documentation これといってすごいところはありませんが、気楽に使えそうなので試してみました。 目次…

【python】sklearnのclass_weightの挙動

はじめに 先に断っておくと、class_weightの挙動はモデルによって異なる可能性が十分ある。今回はsklearn.svm.SVCとsklearn.ensemble.RandomForestClassifierのドキュメントを参照して、一応基本的に共通する部分を抜き出した。 class_weightを調整する必要…

【python】sklearnで「何もしない」モデルがほしい

sklearnで「何もしない」モデルがあると、チョー便利。個人的にはそう思う。 どうやって使うかというと、具体的には以前の記事で書いたFeatureUnionと組み合わせて使う。 参考(以前の記事):【python】複数の特徴をまとめるFeatureUnion - 静かなる名辞 た…

【python】複数の特徴をまとめるFeatureUnion

単一の入力データから、複数の処理方法で幾つもの異なる特徴量が得られる・・・というシチュエーションがある。 この場合、「どれが最善か」という観点でどれか一つを選ぶこともできるけど、そうすると他の特徴量の情報は捨ててしまうことになる。総合的な性…

複数の目的変数で回帰を行う方法

はじめに 回帰分析を行う際、複数の目的変数に対して回帰をしたい場合があります。普通のモデルではできないのでちょっと面食らいますが、やり方は色々あるようです。 目次 はじめに 目的変数の数だけ回帰モデルを作る方法 複数の目的変数に対応したモデルを…

【python】SOMのライブラリSomocluはかなりおすすめ

SOM(Self-organizing maps:自己組織化写像)は割と古めの、データの可視化手法です(それ以外にも使えると思いますが)。 今回はpythonのSOMライブラリSomocluを使ってみたら、けっこう良かったというネタです。 目次 SOMの概要 ライブラリがない それでも頑…

cross_val_scoreはもうやめよう!一発で交差検証するにはcross_validateを使う

sklearnで交差検証をしてスコアを評価する方法としては、cross_val_scoreがよく推奨されているような気がします。実際、cross_val_scoreで検索すると日本語の記事がたくさん引っかかります。 しかし、cross_val_scoreは複数の評価指標を算出することができず…

【python】SelectKBestのscore_funcによる速度差を比較

SelectKBestはsklearnの簡単に特徴選択ができるクラスです。ざっくりと特徴選択したいときに、とても便利です。sklearn.feature_selection.SelectKBest — scikit-learn 0.20.1 documentation ところで、このSelectKBestにはscore_funcというパラメータを指定…

【python】numpyでデータをランダムサンプリング

機械学習に使うデータをランダムサンプリングしたいときがある。簡単そうなのにやり方が見つからないから自分で書く。 目次 実装方針 重複ありランダムサンプリング 重複なしランダムサンプリング 実装と結果 そもそもなにに使いたかったの? 裏技 ※追記(参…

【python】sklearnのPCAでsvd_solverによる速度差を比較

sklearnのPCA(主成分分析)がやたら遅くて腹が立ちました。計算コストを下げるために次元削減してるのに、次元削減で計算コスト食ったら意味がありません。 とにかくこのPCAを高速化したかったので、svd_solverを変えてどうなるか試しました。なお、腹が立…

ランダムフォレストとSVMの使い分け

はじめに ランダムフォレスト(RandomForest)とSVM(Support Vector Machine)はよく比較される分類器です。でも、様々なシチュエーションで、けっきょくどちらを使うべきなのか、という指針はあまり見かけません。 私は研究などで*1両者を使ってきて、それな…

【python】分類タスクの評価指標の解説とsklearnでの計算方法

混同行列、適合率、再現率、F1値の基本と多クラス分類のマクロ平均・マイクロ平均の理論、それらのsklearnでの計算について解説

sklearnのclassification_reportで多クラス分類の結果を簡単に見る

多クラス分類をしていると、「どのクラスが上手く分類できてて、どのクラスが上手く行ってないんだろう」と気になることがままあります。そういった情報を簡単に要約して出力してくれるのがsklearnのclassification_reportで、簡単に使える割に便利なので実…

【python】RandomForestの木の本数を増やすとどうなるか?

RandomForest(ランダムフォレスト)には木の本数という重要なパラメータがある。slearnのデフォルトは10だが、実際に使うときは1000以上にしてやらないと良い性能が得られないということをよく経験する。 これを大きくすることで、一体どんな効果が得られる…

【python】sklearnのPipelineを使うとできること

機械学習では、何段もの前処理をしてから最終的な分類や回帰のアルゴリズムに入力するということがよくあります。 前処理にはけっこう泥臭い処理も多く、leakageの問題なども絡んできます。はっきり言って自分で書こうとすると面倒くさいです。 こういう問題…