*目次 [#jf18b28d]
#contents
*はじめに [#a3b569c5]
scikit-learnは機械学習ライブラリーです。
多くの機械学習手法を同じような方法で使うことができますので、共通部分を押さえておくと、アルゴリズムをよく知らない機械学習手法であっても、とりあえず使ってみることができます。
そこで、ここでは、その共通部分について説明し、scikit-learnで使うことができる代表的な機械学習アルゴリズムを紹介します。
*機械学習と予測モデル [#j09bc4c2]
機械学習では、データから''予測モデル''を学習します。
予測モデルへの入力は、一つだけとは限らず、一般的には複数の値が入力されます。
予測モデルからの出力も、一般的に一つだけとは限りませんが、基礎的な機械学習では一つです。
そこで、予測モデルへの入力はベクトル [math]X[/math] と表し、予測モデルからの出力はスカラー(値)[math]y[/math] と表します。
訓練データに出力値 [math]y[/math] が与えられているものを''教師付き学習''、与えられていないものを''教師なし学習''といいます。
**教師付き学習 [#gbee4a0a]
教師付き学習では、入力 [math]X[/math] とそれに対応する出力 [math]y[/math] の組 [math](X,\,y)[/math] の集合 [math]\mathcal{D}[/math] から、
\[ y = f(X) \]
となる関数 [math]f[/math] を求めます。
この関数 [math]f[/math] が予測モデルです。
出力 [math]y[/math] がカテゴリー、ラベル、クラスといった、離散値のとき、この問題を''分類'' (clasiffication, categorization)といいます。
出力 [math]y[/math] が数値(連続値)のとき、この問題を''回帰'' (regression)といいます。
**教師なし学習 [#ab63a04d]
教師なし学習は、入力 [math]X[/math] の集合 [math]\mathcal{D}[/math] だけから、関数 [math]f[/math] を求めます。
(正解となるグループはわかっていないが)データをいくつかのグループに分ける問題を''クラスタリング'' (clustering)といいます。
*Pythonプログラムの書き方 [#v35d25fc]
**ライブラリーの読み込み [#jcd3ab0b]
ライブラリー名は ''sklearn'' です。
NumPyやpandasのサンプル・コードはライブラリー全体を読みますが、scikit-learnのサンプル・コードは必要なクラスだけを読み込んでいます。
例えば、決定木のクラス sklearn.tree.DecisionTreeClassifier を読み込むには、次のようにします。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
}}
**予測モデル学習器の生成 [#xc006ff2]
学習アルゴリズムのクラスのコンストラクターを使うと、デフォルトの学習パラメーターを用いた予測モデル学習器を生成することができます。
例えば、決定木の学習器を生成するには、次のようにします。
#geshi(python){{
model = DecisionTreeClassifier()
}}
学習アルゴリズムごとに独自の学習パラメーターがあり、コンストラクターへの引数で設定することができます。
例えば、木の深さ max_depth という学習パラメーターを 3 に設定する場合は、次のようにします。
#geshi(python){{
model = DecisionTreeClassifier(max_depth=3)
}}
各アルゴリズムの学習パラメーターについては、scikit-learnのドキュメントのAPI Referenceを参照してください。
-[[API Reference:http://scikit-learn.org/stable/modules/classes.html]] - scikit-learn
**予測モデルの学習 [#o07b01f7]
どの予測モデル学習器にも予測モデルを学習するためのfit関数が用意されていて、これを呼び出すだけで予測モデルを学習することができます。
教師付き学習の予測モデルを学習する場合、入力 [math]X[/math] と出力 [math]y[/math] を引数として渡します。
#geshi(python){{
model.fit(X, y)
}}
教師なし学習の予測モデルを学習する場合、入力 [math]X[/math] だけを引数として渡します。
#geshi(python){{
model.fit(X)
}}
入力 [math]X[/math] と出力 [math]y[/math] を用意する方法については、次のページを見てください。
-[[Pythonでデータ分析する次の一歩(データ分析支援ライブラリー、pandas編)>機械学習/Pythonでデータ分析する次の一歩(データ分析支援ライブラリー、pandas編)]] - とうごろうぃき
-[[Pythonで決定木を使う>機械学習/Pythonで決定木を使う]] - とうごろうぃき
**学習した予測モデルの評価 [#nd6d9a30]
どの予測モデル学習器にも学習した予測モデルを評価するためのscore関数が用意されていて、これを呼び出すだけで学習した予測モデルを評価することができます。
教師付き学習の予測モデルを評価する場合、入力 [math]X[/math] と出力 [math]y[/math] を引数として渡します。
#geshi(python){{
model.score(X, y)
}}
教師なし学習の予測モデルを学習する場合、入力 [math]X[/math] だけを引数として渡します。
#geshi(python){{
model.score(X)
}}
分類分析用の学習器のスコアは平均精度 (mean accuracy)、回帰分析用の学習器のスコアは決定係数 [math]R^2[/math] です。
*分類分析 [#j32309c9]
**決定木 [#w0c97b40]
決定木 (Decision Tree) 学習は、木構造の分類規則(決定木)を学習します。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X, y)
}}
学習パラメーターには、節の評価基準 criterion、木の深さ max_depth などがあります。
**ランダム・フォレスト (RF) [#ab683f82]
ランダム・フォレスト (Random Forest) は、たくさんの決定木をランダムに生成し、いいものを組み合わせて予測モデルを作成します。
#geshi(python){{
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X, y)
}}
学習パラメーターには、決定木と同じものに加えて、決定木の数 n_estimators、乱数のシード random_state などがあります。
**勾配ブースティング (GB) [#u3447b99]
ランダム・フォレストはランダムにたくさんの決定木を作成しますが、勾配ブースティング (Gradient Boosting) は決定木を一つずつ作っていきます。
#geshi(python){{
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier()
model.fit(X, y)
}}
学習パラメーターには、ランダム・フォレストと同じものに加えて、損失関数 loss、学習率 learnin_rate などがあります。
**サポート・ベクター・マシン (SVM, SVC) [#m78bfcf8]
SVC (Support Vector Classififier) は、境界線(面、超平面)に最も近いデータまでの距離(マージン)が最大となるような境界線を求めます。
カーネル・トリックと呼ばれる方法で、線形分離不可能な問題も解くことができます。
もともとSVM (Support Vector Machine) と呼ばれていましたが、同じ原理で回帰を行うSVRと区別するためにSVCとも呼ばれます。
#geshi(python){{
from sklearn.svm import SVC
model = SVC()
model.fit(X, y)
}}
学習パラメーターには、カーネルの種類 kernel、正則化パラメーター C などがあります。
カーネルによる独自のパラメーターもあります。
**ニューラル・ネットワーク (NN) [#d909282b]
人間の脳の神経回路網をモデルにしたニューラル・ネットワーク (Neural Network) の一つである多層パーセプトロン (Multi-layer Perceptron) を構築します。
#geshi(python){{
from sklearn.neural_network import MLPClassifier
model = MLPClassifier()
model.fit(X, y)
}}
学習パラメーターには、隠れ層のユニット数 hidden_layer_sizes、活性化関数 activation、最適化手法 solver、正則化パラメーター alpha、学習率 learning_rate などがあります。
**ナイーブ・ベイズ (NB) [#t6eab5dc]
それぞれの説明変数が条件付き独立であることを仮定して、ベイズの定理を用いてデータがそれぞれのクラスに所属する確率を求め、予測した所属確率が最も高いクラスに分類します。
#geshi(python){{
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X, y)
}}
学習パラメーターは特にありません。
説明変数が連続値で正規分布に従っていると仮定できる場合はガウシアン・ナイーブ・ベイズ GaussianNB を用い、離散値の場合は多項ナイーブ・ベイズ MultinomialNB を用い、二値の場合はベルヌーイ・ナイーブ・ベイズ BernoulliNB を用います。
**判別分析 (LDA) [#s114138e]
データの分布が正規分布に従っているものとして、データを二つに分けるための線形判別関数を解析的に求めます。
#geshi(python){{
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
model = LinearDiscriminantAnalysis()
model.fit(X, y)
}}
学習パラメーターには、最適化手法 solver などがあります。
**二項ロジスティック回帰分析 [#nf917add]
ロジスティック関数を用いてデータがクラスに所属する確率を予測するモデルを学習します。
出力が確率である予測モデルを学習する回帰問題として学習し、予測した所属確率が最も高いクラスに分類して分類問題に適用します。
#geshi(python){{
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, y)
}}
学習パラメーターには、正則化手法 penalty、最適化手法 solver などがあります。
*回帰分析 [#hcc4e0bc]
**線形回帰 (OLS) [#r2438ce6]
最小二乗法 (Ordinary Least Squares) を使って線形和の式を求めます。
#geshi(python){{
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
}}
学習パラメーターには、予測モデルを作成する前に説明変数を正規化する normalize、定数項をなしにする fit_intercept などがあります。
**LARS [#p207be11]
最小角度回帰 (Least Angle Regression) を使って線形和の式を求めます。
#geshi(python){{
from sklearn.linear_model import LARS
model = LARS()
model.fit(X, y)
}}
学習パラメータは、線形回帰とほぼ同じです。
**Lasso回帰 [#qfdb0440]
線形和にL1正則化の項を加えた式を求めます。
L1正則化は係数をなるべく 0 にするよう係数の大きさにペナルティを課します。
#geshi(python){{
from sklearn.linear_model import Lasso
model = Lasso()
model.fit(X, y)
}}
学習パラメーターには、線形回帰と同じものに加えて、正則化項の係数 alpha などがあります。
**Ridge回帰 [#xd7b0fe7]
線形和にL2正則化の項を加えた式を求めます。
L2正則化は係数をなるべく 0 に近づけるよう係数の大きさにペナルティを課します。
#geshi(python){{
from sklearn.linear_model import Lasso
model = Lasso()
from sklearn.linear_model import Ridge
model = Ridge()
model.fit(X, y)
}}
学習パラメーターには、Lasso回帰と同じものに加えて、最適化手法 solver などがあります。
**回帰木 [#tba88353]
決定木と同じアルゴリズムを使って回帰を行います。
#geshi(python){{
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor()
model.fit(X, y)
}}
学習パラメーターは、分類用の決定木とほぼ同じです。
評価基準 criterion には、平均二乗誤差 mse、平均絶対誤差 mae などがあります。
**ランダム・フォレスト (RF) [#f8517261]
回帰木をベースにしたランダム・フォレスト (Random Forest) を使って回帰を行います。
#geshi(python){{
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X, y)
}}
回帰木をベースにした学習パラメーターは、分類用のランダム・フォレストとほぼ同じです。
評価基準 criterion は、回帰木と同じです。
**勾配ブースティング (GB) [#ve391ffe]
回帰木をベースにした勾配ブースティングを使って回帰を行います。
#geshi(python){{
from sklearn.ensemble import GradientBoostingRegressor
model = GradientBoostingRegressor()
model.fit(X, y)
}}
学習パラメーターは、分類用の勾配ブースティングとほぼ同じです。
評価基準 criterion は、回帰木と同じです。
**サポート・ベクター・マシン (SVM, SVR) [#h5a2ea7e]
サポート・ベクター・マシン (Support Vector Machine) を使って回帰を行います。
分類用のSVCと区別するために、サポート・ベクター回帰 (Support Vector Regression, SVR) と呼ばれます。
#geshi(python){{
from sklearn.svm import SVR
model = SVR()
model.fit(X, y)
}}
学習パラメーターは、分類用のサポート・ベクター・マシンとほぼ同じです。
**ニューラル・ネットワーク (NN) [#n6f76060]
多層パーセプトロン (Multi-layer Perceptron) を使って回帰を行います。
#geshi(python){{
from sklearn.neural_network import MLPRegressor
model = MLPRegressor()
model.fit(X, y)
}}
学習パラメーターは、分類用のニューラル・ネットワークとほぼ同じです。
*クラスター分析 [#pd613872]
**k-平均法 (k-means) [#f0dcc483]
まず、[math]k[/math]個のクラスター中心をランダムに配置します。
それぞれのデータを最も近い中心のクラスターに入れ、それぞれのクラスターの中心をそのクラスターに属するデータの中心に置き換えることを、クラスターの中心が移動しなくなるまで繰り返します。
#geshi(python){{
from sklearn.cluster import KMeans
model = KMeans()
model.fit(X)
}}
学習パラメーターには、クラスター数 n_clusters、初期化手法 init、試行回数 n_init、最大繰り返し数 max_iter、乱数のシード random_state などがあります。
**スペクトラル・クラスタリング [#r7719c9c]
データ間の距離から類似度を求め、類似度行列を次元削減し、k-平均法を行います。
#geshi(python){{
from sklearn.cluster import SpectralClustering
model = SpectralClustering()
model.fit(X)
}}
**凝集型クラスタリング [#m1a95183]
最も近いデータ(またはクラスター)とデータ(またはクラスター)をまとめて、一つのクラスターを作ります。
これを繰り返します。
#geshi(python){{
from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering()
model.fit(X)
}}
**Birch [#r281b800]
クラスターの特徴を表す木を作成し、クラスタリングを行います。
#geshi(python){{
from sklearn.cluster import Birch
model = Birch()
model.fit(X)
}}
**混合ガウス分布推定 (GMM) [#s4f3e483]
#geshi(python)){{
from sklearn.mixture import GaussianMixture
model = GaussianMixture()
mode.fit(X)
}}
**ベイジアン混合ガウス分布推定 (BGMM) [#jfc0f5a7]
#geshi(python)){{
from sklearn.mixture import BayesianGaussianMixture
model = BayesianGaussianMixture()
mode.fit(X)
}}