scikit-learn機械学習モジュール(下)
クロス検証
一般に、トレーニングセットとテストセットに70%と30%しか分けられない方法を単純交差検証と呼ぶが、もう一つのK折り返し交差検証とは、データをK部に分け、その中のK-1部を順番に訓練とし、もう一つをテストセットとして、平均的な汎化誤差が最小であるモデルを指す.具体的には、
>>>
from
sklearn.model_selection
import
cross_val_score
>>>
cross_val_score
(
clf
,
X
,
y
,
cv
=
5
)
クロス検証によるスーパーパラメータ最適化
正規化された線形モデルについては,嶺回帰(L 2正規)とLasso回帰(L 1正規)があり,使用時には
cross_val_score(model, X, y).mean()は交差検証の平均汎化誤差を得た.
一連のalpha値を提供すると、GridSearchCV関数を使用して最適なalpha値を自動的に見つけることができます.
scikit-learnは、CVを内蔵したモデルも提供します.
非監視ラーニングひかんしラーニング:次元を下げて表示します
(上)PCAについて述べたが、関数には次元パラメータ、白化パラメータなどが提供されている.
>>>
pca
=
PCA
(
n_components
=
2
,
whiten
=
True
)
>>>
pca
.
fit
(
X
)Xデータに基づいてフィッティングされたpcaモデルは、新しいデータを次元ダウンマッピングすることができます.
2次元および3次元のデータフィーチャーは、図に表示されます.
流形学習方法:sklearn.manifold.TSNE
この方法は強力であるが,統計解析では制御が困難である.数値を例にとると、64次元のフィーチャーは、マッピング2次元で可視化されます.
>>>
from
sklearn.manifold
import
TSNE
>>>
tsne
=
TSNE
(
n_components
=
2
,
random_state
=
0
)
>>>
X_2d
=
tsne
.
fit_transform
(
X
)
>>>
# Visualize the data
>>>
plt
.
scatter
(
X_2d
[:,
0
],
X_2d
[:,
1
],
c
=
y
)このメソッドは新しいデータには使用できないのでfit_を使用する必要があります.transform()
例:特徴顔(chaining PCA&SVms)
(一)
顔データセットについてはLabeled Faces in the Wild(http://vis-www.cs.umass.edu/lfw/)、sklearn提供
ただし、軽量級の
faces
=
datasets
.
fetch_olivetti_faces
()
同様に、トレーニングセットとテストセットに分けます.
X_train
,
X_test
,
y_train
,
y_test
=
train_test_split
(
faces
.
data
,
faces
.
target
,
random_state
=
0
)(二)
次に、元の次元が多すぎるので、PCAで前処理を行います.
pca
=
decomposition
.
PCA
(
n_components
=
150
,
whiten
=
True
)
pca
.
fit
(
X_train
)すると、150個の主成分(pca.components_)が得られるつまり特徴顔(オリジナルサイズの画像でもありますが)ですが
データの後、この150の特徴的な顔をベースにします.
X_test_pca
=
pca
.
transform
(
X_test
)を150次元に下げました
(三)
SVMモデルを使用した分類の学習
clf
=
svm
.
SVC
(
C
=
5.
,
gamma
=
0.001
)
clf
.
fit
(
X_train_pca
,
y_train
)
表示結果:
for
i
in
range
(
15
):
ax
=
fig
.
add_subplot
(
3
,
5
,
i
+
1
,
xticks
=
[],
yticks
=
[])
ax
.
imshow
(
X_test
[
i
]
.
reshape
(
faces
.
images
[
0
]
.
shape
),
cmap
=
plt
.
cm
.
bone
)
y_pred
=
clf
.
predict
(
X_test_pca
[
i
,
np
.
newaxis
])[
0
]
color
=
(
'black'
if
y_pred
==
y_test
[
i
]
else
'red'
)
ax
.
set_title
(
faces
.
target
[
y_pred
],
fontsize
=
'small'
,
color
=
color
)
また、sklearnはPipeliningメソッドを提供し、2つのモデルを直接埋め込むことができます.
clf
=
Pipeline
([(
'pca'
,
decomposition
.
PCA
(
n_components
=
150
,
whiten
=
True
)),
(
'svm'
,
svm
.
LinearSVC
(
C
=
1.0
))])
clf
.
fit
(
X_train
,
y_train
)
y_pred
=
clf
.
predict
(
X_test
)
一般に、トレーニングセットとテストセットに70%と30%しか分けられない方法を単純交差検証と呼ぶが、もう一つのK折り返し交差検証とは、データをK部に分け、その中のK-1部を順番に訓練とし、もう一つをテストセットとして、平均的な汎化誤差が最小であるモデルを指す.具体的には、
clf = KNeighborsClassifier()
>>>
from
sklearn.model_selection
import
cross_val_score
>>>
cross_val_score
(
clf
,
X
,
y
,
cv
=
5
)
cv = ShuffleSplit(n_splits = 5) CV
は、5つの汎化誤差を含むリストを返します.クロス検証によるスーパーパラメータ最適化
正規化された線形モデルについては,嶺回帰(L 2正規)とLasso回帰(L 1正規)があり,使用時には
from sklearn.linear_model import Ridge, Lasso
model=Ridge()/デフォルトのalphaパラメータを使用するか、alpha値を指定できます.cross_val_score(model, X, y).mean()は交差検証の平均汎化誤差を得た.
一連のalpha値を提供すると、GridSearchCV関数を使用して最適なalpha値を自動的に見つけることができます.
from sklearn.grid_search import GridSearchCV
gscv = GridSearchCV(Model(), dict(alpha=alphas), cv=3).fit(X, y)
scikit-learnは、CVを内蔵したモデルも提供します.
from sklearn.linear_model import RidgeCV, LassoCV
model = RidgeCV(alphas=alphas, cv=3).fit(X, y)
この方法はGridSearchCVと同様の結果を得ることができるが,モデルの検証のためにcross_を使用する必要がある.val_score関数scores = cross_val_score(Model(alphas=alphas, cv=3), X, y, cv=3)
非監視ラーニングひかんしラーニング:次元を下げて表示します
(上)PCAについて述べたが、関数には次元パラメータ、白化パラメータなどが提供されている.
from sklearn.decomposition import PCA
>>>
pca
=
PCA
(
n_components
=
2
,
whiten
=
True
)
>>>
pca
.
fit
(
X
)Xデータに基づいてフィッティングされたpcaモデルは、新しいデータを次元ダウンマッピングすることができます.
X_pca = pca.transform(X)
このとき、X_pcaデータの特徴は2次元に下がり、次元を下げた後の特徴分布は0平均値に従い、stdは1である.2次元および3次元のデータフィーチャーは、図に表示されます.
流形学習方法:sklearn.manifold.TSNE
この方法は強力であるが,統計解析では制御が困難である.数値を例にとると、64次元のフィーチャーは、マッピング2次元で可視化されます.
# Fit and transform with a TSNE
>>>
from
sklearn.manifold
import
TSNE
>>>
tsne
=
TSNE
(
n_components
=
2
,
random_state
=
0
)
>>>
X_2d
=
tsne
.
fit_transform
(
X
)
>>>
# Visualize the data
>>>
plt
.
scatter
(
X_2d
[:,
0
],
X_2d
[:,
1
],
c
=
y
)このメソッドは新しいデータには使用できないのでfit_を使用する必要があります.transform()
例:特徴顔(chaining PCA&SVms)
(一)
顔データセットについてはLabeled Faces in the Wild(http://vis-www.cs.umass.edu/lfw/)、sklearn提供
sklearn.datasets.fetch_lfw_people()
ただし、軽量級の
from sklearn import datasets
faces
=
datasets
.
fetch_olivetti_faces
()
同様に、トレーニングセットとテストセットに分けます.
from sklearn.model_selection import train_test_split
X_train
,
X_test
,
y_train
,
y_test
=
train_test_split
(
faces
.
data
,
faces
.
target
,
random_state
=
0
)(二)
次に、元の次元が多すぎるので、PCAで前処理を行います.
from sklearn import decomposition
pca
=
decomposition
.
PCA
(
n_components
=
150
,
whiten
=
True
)
pca
.
fit
(
X_train
)すると、150個の主成分(pca.components_)が得られるつまり特徴顔(オリジナルサイズの画像でもありますが)ですが
データの後、この150の特徴的な顔をベースにします.
X_train_pca = pca.transform(X_train)
X_test_pca
=
pca
.
transform
(
X_test
)を150次元に下げました
(三)
SVMモデルを使用した分類の学習
from sklearn import svm
clf
=
svm
.
SVC
(
C
=
5.
,
gamma
=
0.001
)
clf
.
fit
(
X_train_pca
,
y_train
)
表示結果:
fig = plt.figure(figsize=(8, 6))
for
i
in
range
(
15
):
ax
=
fig
.
add_subplot
(
3
,
5
,
i
+
1
,
xticks
=
[],
yticks
=
[])
ax
.
imshow
(
X_test
[
i
]
.
reshape
(
faces
.
images
[
0
]
.
shape
),
cmap
=
plt
.
cm
.
bone
)
y_pred
=
clf
.
predict
(
X_test_pca
[
i
,
np
.
newaxis
])[
0
]
color
=
(
'black'
if
y_pred
==
y_test
[
i
]
else
'red'
)
ax
.
set_title
(
faces
.
target
[
y_pred
],
fontsize
=
'small'
,
color
=
color
)
また、sklearnはPipeliningメソッドを提供し、2つのモデルを直接埋め込むことができます.
from sklearn.pipeline import Pipeline
clf
=
Pipeline
([(
'pca'
,
decomposition
.
PCA
(
n_components
=
150
,
whiten
=
True
)),
(
'svm'
,
svm
.
LinearSVC
(
C
=
1.0
))])
clf
.
fit
(
X_train
,
y_train
)
y_pred
=
clf
.
predict
(
X_test
)