機械学習/Pythonで説明変数を減らす
をテンプレートにして作成
開始行:
*目次 [#he9ab66a]
#contents
*はじめに [#s17a8242]
前回、Pythonの機械学習ライブラリーscikit-learnを用いて、...
-[[Pythonで決定木を使う>機械学習/Pythonで決定木を使う]] -...
前回はすべての説明変数を用いて予測モデルを学習しましたが...
また、説明変数が多すぎると、過学習 (Overfitting) が起こっ...
そこで、今回は、説明変数を減らす方法について説明します。
環境やデータは前回と同じです。
*全体の流れ [#v2bd67a1]
前回と同様に、TSVファイルを読み込んでデータフレームを作成...
#geshi(python){{
import pandas as pd
df_iris_train = pd.read_csv('train.tsv', delimiter='\t',...
df_iris_test = pd.read_csv('test_X.tsv', delimiter='\t',...
}}
次に、予測モデルへの入力となる特徴行列 X と予測モデルから...
#geshi(python){{
X = df_iris_train.drop('class', axis=1).values
y = df_iris_train.class.values
}}
ここで、特徴行列 X の列が多すぎるときに、特徴を減らします。
まず、特徴選択器を用意し、fit関数を用いて特徴行列 X(手法...
次に、transform関数を用いて特徴行列 X を新しい特徴行列 X_...
(次のプログラムが何をしているかについては後述します。)
#geshi(python){{
from sklearn.feature_selection import SelectKBest
fs = SelectKBest(k=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
作成した特徴行列 X_ から予測モデルを学習します。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X_, y)
}}
テスト・データに適用する場合は、訓練データから学習した特...
#geshi(python){{
X = df_iris_test.values
X_ = fs.transform(X)
p = clf.predict(X_)
}}
*説明変数を減らす手法 [#t720c188]
説明変数を減らす手法としては、たくさんある説明変数(特徴...
特徴選択で選択された列は、元の特徴行列に含まれている列と...
**特徴選択 [#w18e7620]
***分散が小さい特徴を削除する [#s797aea4]
分散が小さい特徴は出力に影響を与えにくいので、分散が閾値...
#geshi(python){{
from sklearn.feature_selection import VarianceThreshold
fs = VarianceThreshold(threshold=1.0)
fs.fit(X)
X_ = fs.transform(X)
}}
ここで、fsは特徴選択器を格納するための変数であり、feature...
***単変量解析のスコアが低い特徴を削除する [#p454e781]
単変量解析を行って、スコアが低い特徴を削除し、残った特徴...
#geshi(python){{
from sklearn.feature_selection import SelectKBest
fs = SelectKBest(k=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここで、k は選択する特徴の数です。
回帰問題の場合は、score_func オプションに 'f_regression' ...
***最も重要でない特徴を繰り返し削除する [#z2764a0a]
再帰的特徴削減 (Recursive Feature Elimination, RFE) とい...
最も重要でない特徴を決めるために、学習器 estimator が必要...
#geshi(python){{
from sklearn.feature_selection import RFE
from sklearn.svm import SVC
est = SVC()
fs = RFE(est, n_features_to_select=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、SVCを estimator として使っています。
n_features_to_select は選択する特徴の数です。
***L1正則化を用いて特徴を削除する [#n10dc8f1]
特徴に対する係数の絶対値が大きくなりすぎないようにペナル...
係数がゼロの特徴量はなくても構わないものなので、係数がゼ...
L1正則化を行う学習器 estimator が必要です。
#geshi(python){{
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
est = LinearSVC(penalty='l1')
fs = SelectFromModel(est)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、線形SVCを estimator として使っています。
***決定木学習を用いて特徴を選択する [#ef0d4b1c]
ランダム・フォレストのような決定木ベースの学習器を用いて...
特徴の重要度 feature_importances_ を計算する学習器 estima...
#geshi(python){{
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
est = RandomForestClassifier()
fs = SelectFromModel(est)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、ランダム・フォレストを estimator として使ってい...
**次元削減 [#z5598674]
***主成分分析を用いて次元を削減する [#bef6e95e]
主成分分析 (Principal Component Analysis, PCA) を用いて特...
PCAは、データ分析において特徴数が多いときに次元を圧縮する...
#geshi(python){{
from sklearn.decomposition import PCA
fs = PCA(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***特異値分解を用いて次元を削減する [#xa3e88a7]
特異値分解 (Singular Value Decomposition, SVD) を用いて特...
SVDは、制御理論の分野でノイズを含む環境でのロバストな制御...
#geshi(python){{
from sklearn.decomposition import TruncatedSVD
fs = TruncatedSVD(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***独立成分分析を用いて次元を削減する [#k22ed5e1]
独立成分分析 (Independent Component Analysis, ICA) を用い...
ICAは、音声認識の分野で混合信号を独立した成分に分解するの...
#geshi(python){{
from sklearn.decomposition import FastICA
fs = FastICA(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***潜在的ディリクレ配分法を用いて次元を削減する [#gd56787c]
潜在的ディリクレ配分法 (Latent Dirichlet Allocation, LDA)...
LDAは、自然言語処理の分野で文書からトピックを抽出するのに...
#geshi(python){{
from sklearn.decomposition import LatentDirichletAllocation
fs = LatentDirichletAllocation(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
終了行:
*目次 [#he9ab66a]
#contents
*はじめに [#s17a8242]
前回、Pythonの機械学習ライブラリーscikit-learnを用いて、...
-[[Pythonで決定木を使う>機械学習/Pythonで決定木を使う]] -...
前回はすべての説明変数を用いて予測モデルを学習しましたが...
また、説明変数が多すぎると、過学習 (Overfitting) が起こっ...
そこで、今回は、説明変数を減らす方法について説明します。
環境やデータは前回と同じです。
*全体の流れ [#v2bd67a1]
前回と同様に、TSVファイルを読み込んでデータフレームを作成...
#geshi(python){{
import pandas as pd
df_iris_train = pd.read_csv('train.tsv', delimiter='\t',...
df_iris_test = pd.read_csv('test_X.tsv', delimiter='\t',...
}}
次に、予測モデルへの入力となる特徴行列 X と予測モデルから...
#geshi(python){{
X = df_iris_train.drop('class', axis=1).values
y = df_iris_train.class.values
}}
ここで、特徴行列 X の列が多すぎるときに、特徴を減らします。
まず、特徴選択器を用意し、fit関数を用いて特徴行列 X(手法...
次に、transform関数を用いて特徴行列 X を新しい特徴行列 X_...
(次のプログラムが何をしているかについては後述します。)
#geshi(python){{
from sklearn.feature_selection import SelectKBest
fs = SelectKBest(k=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
作成した特徴行列 X_ から予測モデルを学習します。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X_, y)
}}
テスト・データに適用する場合は、訓練データから学習した特...
#geshi(python){{
X = df_iris_test.values
X_ = fs.transform(X)
p = clf.predict(X_)
}}
*説明変数を減らす手法 [#t720c188]
説明変数を減らす手法としては、たくさんある説明変数(特徴...
特徴選択で選択された列は、元の特徴行列に含まれている列と...
**特徴選択 [#w18e7620]
***分散が小さい特徴を削除する [#s797aea4]
分散が小さい特徴は出力に影響を与えにくいので、分散が閾値...
#geshi(python){{
from sklearn.feature_selection import VarianceThreshold
fs = VarianceThreshold(threshold=1.0)
fs.fit(X)
X_ = fs.transform(X)
}}
ここで、fsは特徴選択器を格納するための変数であり、feature...
***単変量解析のスコアが低い特徴を削除する [#p454e781]
単変量解析を行って、スコアが低い特徴を削除し、残った特徴...
#geshi(python){{
from sklearn.feature_selection import SelectKBest
fs = SelectKBest(k=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここで、k は選択する特徴の数です。
回帰問題の場合は、score_func オプションに 'f_regression' ...
***最も重要でない特徴を繰り返し削除する [#z2764a0a]
再帰的特徴削減 (Recursive Feature Elimination, RFE) とい...
最も重要でない特徴を決めるために、学習器 estimator が必要...
#geshi(python){{
from sklearn.feature_selection import RFE
from sklearn.svm import SVC
est = SVC()
fs = RFE(est, n_features_to_select=3)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、SVCを estimator として使っています。
n_features_to_select は選択する特徴の数です。
***L1正則化を用いて特徴を削除する [#n10dc8f1]
特徴に対する係数の絶対値が大きくなりすぎないようにペナル...
係数がゼロの特徴量はなくても構わないものなので、係数がゼ...
L1正則化を行う学習器 estimator が必要です。
#geshi(python){{
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
est = LinearSVC(penalty='l1')
fs = SelectFromModel(est)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、線形SVCを estimator として使っています。
***決定木学習を用いて特徴を選択する [#ef0d4b1c]
ランダム・フォレストのような決定木ベースの学習器を用いて...
特徴の重要度 feature_importances_ を計算する学習器 estima...
#geshi(python){{
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
est = RandomForestClassifier()
fs = SelectFromModel(est)
fs.fit(X, y)
X_ = fs.transform(X)
}}
ここでは、ランダム・フォレストを estimator として使ってい...
**次元削減 [#z5598674]
***主成分分析を用いて次元を削減する [#bef6e95e]
主成分分析 (Principal Component Analysis, PCA) を用いて特...
PCAは、データ分析において特徴数が多いときに次元を圧縮する...
#geshi(python){{
from sklearn.decomposition import PCA
fs = PCA(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***特異値分解を用いて次元を削減する [#xa3e88a7]
特異値分解 (Singular Value Decomposition, SVD) を用いて特...
SVDは、制御理論の分野でノイズを含む環境でのロバストな制御...
#geshi(python){{
from sklearn.decomposition import TruncatedSVD
fs = TruncatedSVD(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***独立成分分析を用いて次元を削減する [#k22ed5e1]
独立成分分析 (Independent Component Analysis, ICA) を用い...
ICAは、音声認識の分野で混合信号を独立した成分に分解するの...
#geshi(python){{
from sklearn.decomposition import FastICA
fs = FastICA(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ここでは、合成後の次元数 n_components を 3 としています。
***潜在的ディリクレ配分法を用いて次元を削減する [#gd56787c]
潜在的ディリクレ配分法 (Latent Dirichlet Allocation, LDA)...
LDAは、自然言語処理の分野で文書からトピックを抽出するのに...
#geshi(python){{
from sklearn.decomposition import LatentDirichletAllocation
fs = LatentDirichletAllocation(n_components=3)
fs.fit(X)
X_ = fs.transform(X)
}}
ページ名: