静かなる名辞

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


主成分分析

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

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

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

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

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

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

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

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

本当は怖いSVMと交差検証

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

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

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

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

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

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

はじめに SparsePCAというものがあることを知ったので、使ってみようと思います。 SparsePCAとは? その名の通り、スパースな主成分分析です。スパースな主成分ベクトルを推定します。Sparse PCA - Wikipedia 原理などは理解しないで、カジュアルに使えるか…

GridSearchCV『の』パラメータ・チューニング 高速化中心に

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

【python】MeanShiftのbandwidthを変えるとどうなるか実験してみた

前回の記事ではMeanShiftクラスタリングを試してみました。www.haya-programming.com このMeanShiftにはbandwidthというパラメータがあり、クラスタ数を決定する上で重要な役割を果たしているはずです。 いまいち結果に納得がいかないというとき、bandwidth…

【python】sklearnのMeanShiftクラスタリングを試してみる

はじめに MeanShiftはクラスタリングアルゴリズム。クラスタ数を自動で決定してくれるという長所がある。 理論的には最急降下法で各クラスタの極大点を探していく感じらしいです。わかりやすい解説があったので、リンクを張っておきます(ただし私自身はすべ…

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

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

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

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

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

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

【python】sklearnのPCAでloading(主成分負荷量)を計算する

PCA(主成分分析)のloading*1がほしいときがあります。 sklearnでは一発では出ません。 ドキュメントはここ。 sklearn.decomposition.PCA — scikit-learn 0.21.2 documentation 目次 PCA.components_は確かにあるけど・・・ loadingを計算しよう 罠だった …

【python】sklearnで因子分析を試す

pythonで因子分析をやる人はあまりいないようだが、sklearnにはしっかりモデルが存在している。ついさっき気づいた。sklearn.decomposition.FactorAnalysis — scikit-learn 0.20.1 documentation 因子分析自体は前からどんなものなのか興味があり、かといっ…

【python】pythonで主成分分析のバイプロット

バイプロット(Biplot)という主成分分析(PCA)の結果の可視化方法があります。 すごく大雑把に言うと、PCAによる写像の前の空間の各特徴(軸)が写像先の空間のどこに向いているかを可視化する方法です。 具体的には、主成分ベクトル(因子負荷量などを使…

【python】numpyで主成分分析を実装してみた

numpyでPCA(principal component analysis:主成分分析)を実装してみました。自分の理解を深めるためです。 sklearnに実装されているものと同じ結果を出すことを目標にしました。最終的には上手く行きました。 目次 概要 実装 結果 まとめ 概要 主成分分析…

【python】カーネル主成分分析を試してみる

カーネル主成分分析(Kernel PCA)はカーネル法と主成分分析を組み合わせて用い、データを非線形次元圧縮する方法です(こんな説明で良いのか・・・)。 カーネル法のことは勉強中・・・というか正直勉強しようとしてもよくわからないで跳ね返されるのをこれ…

【python】sklearnのPCAで相関行列を使う

主成分分析には共分散行列を用いる方法、相関行列を使う方法がある。 sklearnのPCAを見ると、これに対応するオプションは存在しない。sklearn.decomposition.PCA — scikit-learn 0.20.1 documentation ずっと不思議に思っていたが、ググってたらこんなものを…

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

前回は性能を追い求めると次元がでかくなりすぎて・・・というところで終わっていた。今回はもうちょっと頑張って次元を減らしてみる。 目次 ストップワードの除去 PCA(主成分分析)とLDA(線形判別分析) 分類 ソースコード 結果とまとめ 次回 過去の回 ス…

【python】matplotlibで3次元データを描画し、回転アニメーションにする

3次元くらいのデータを描画したいときがある。簡単に散布図にできると便利。 データの用意 sklearnのload_irisなどで取得できるデータセットを入力にする前提の次のような関数を作った。 from sklearn.decomposition import PCA def gen_3d_data(dataset): p…

【python】LDA(線形判別分析)で次元削減

一般によく使われる次元削減手法としてはPCA(主成分分析)がありますが、他にLDA(Linear Discriminant Analysis:線形判別分析)を使う方法もあります。 これは本来は分類に使われる判別分析という古典的なアルゴリズムで、データが一番分離しやすくなる軸…

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

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

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

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

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

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

【python】混合ガウスモデル (GMM)でハード・ソフトクラスタリング

ソフトクラスタリングの有名な手法としては混合ガウスモデル(混合正規分布モデル)を使った手法があります。この手法はデータが「複数の正規分布から構成されている」と仮定し、その正規分布のパラメタをEMアルゴリズム(expectation–maximization algorith…

【python】skfuzzyのFuzzy c-meansでソフトクラスタリング

はじめに Fuzzy c-meansはソフトクラスタリングの手法です。 pythonではscikit-fuzzyというライブラリで利用できるようです。ということで、実際に使ってみました。 基本的な理論はこちらのサイトなどを参考にしてください。ファジィc-means法 - 機械学習の…

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

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

【python】正準相関分析(Canonical Correlation Analysis)を試してみる

正準相関分析を使うと、2つの多次元データ同士の関連性を分析できるらしい。 面白そうなので試してみた。ちなみに正準相関はsklearn.cross_decomposition.CCAで使える。正準相関自体の解説はほとんどしないので、文中のリンクを参考にして欲しい*1。 目次 一…