scikit-learn机器学习模块(下)

交叉验证

一般只将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, 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方法,可以直接将两个模型嵌到一起:

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 )









































你可能感兴趣的:(python语言,机器学习)