交叉验证
一般只将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个泛化误差的列表。
使用交叉验证进行超参数优化
对于正则化的线性模型,有岭回归(L2正则)和Lasso回归(L1正则),使用时
from sklearn.linear_model import Ridge, Lassomodel = 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 datasetsfaces = datasets . fetch_olivetti_faces ()
同样,分为训练集和测试集:
from sklearn.model_selection import train_test_splitX_train , X_test , y_train , y_test = train_test_split ( faces . data , faces . target , random_state = 0 ) (二)
接下来,原始维度太多,所以通过PCA进行预处理:
from sklearn import decompositionpca = 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方法,可以直接将两个模型嵌到一起:
from sklearn.pipeline import Pipelineclf = 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 )