3、Sklearn datasets
Sklearn提供了標(biāo)準(zhǔn)數(shù)據(jù)(load_xxx)和可以生產(chǎn)的虛擬數(shù)據(jù)(datasets.make_xxx)
可以使用這些進(jìn)行練習(xí)~
- Boston數(shù)據(jù)集
#使用線性回歸模型
from sklearn import datasets
from sklearn.linear_model import LinearRegression
#導(dǎo)入Boston數(shù)據(jù)集,定義特征變量X,目標(biāo)值y
loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target
#定義模型,使用默認(rèn)參數(shù)
model = LinearRegression()
#擬合數(shù)據(jù)集
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])

- 自己構(gòu)造虛擬數(shù)據(jù)進(jìn)行學(xué)習(xí)
from sklearn import datasets
import matplotlib.pyplot as plt
X,y = datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=1)
plt.figure()
plt.scatter(X,y)
plt.show()

【說(shuō)明】
datasets.make_regression
https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html#sklearn.datasets.make_regression
構(gòu)造的各種參數(shù)可以根據(jù)自己需要調(diào)整
Parameters:
n_samples:樣本數(shù),int,可選默認(rèn)100
n_features:特征數(shù)量,int,可選默認(rèn)100
n_targets:int, 回歸目標(biāo)數(shù)量,可選,默認(rèn)1,與樣本相關(guān)聯(lián)的y輸出向量的維數(shù)。默認(rèn)情況下,輸出是標(biāo)量。
noise:噪聲,float,可選 (default=0.0),用于輸出的高斯噪聲的標(biāo)準(zhǔn)差
4、Sklearn model的常用屬性和功能
model常用屬性:
利用上例boston的栗子
#輸出X---》data_X.shape:(506,13)
print(model.coef_)
#輸出y軸的交點(diǎn)
print(model.intercept_)
#獲得模型的參數(shù)
print(model.get_params())
#對(duì)訓(xùn)練情況進(jìn)行打分
print(model.score(data_X,data_y))

model 功能:例如fit、predict等
5、nomalization標(biāo)準(zhǔn)化(scale)
Feature Scaling:
idea:Make sure features are on a similar scale.
栗子:
import numpy as np
from sklearn import preprocessing
from sklearn.cross_validation import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
X,y = make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,
random_state=22,n_clusters_per_class=1,scale=100)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

X = preprocessing.scale(X)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size =.3)
clf = SVC()
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))

當(dāng)不使用preprocessing.scale(X)進(jìn)行標(biāo)準(zhǔn)化的時(shí)候,精確度將下降
6、Cross validation交叉驗(yàn)證
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#引入交叉驗(yàn)證,數(shù)據(jù)分為5組進(jìn)行訓(xùn)練
###引入數(shù)據(jù)集###
iris=load_iris()
X=iris.data
y=iris.target
###訓(xùn)練數(shù)據(jù)###
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
#定義模型,選擇鄰近的5個(gè)點(diǎn)
knn=KNeighborsClassifier(n_neighbors=5)
#交叉驗(yàn)證的評(píng)分:評(píng)分方式為accuracy
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')
#每組的評(píng)分結(jié)果
print(scores)
#平均評(píng)分結(jié)果
print(scores.mean())

【說(shuō)明】
cross_val_score():
sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’)
返回:交叉驗(yàn)證每次運(yùn)行的評(píng)分?jǐn)?shù)組
estimator:數(shù)據(jù)對(duì)象
X:數(shù)據(jù)
y:預(yù)測(cè)數(shù)據(jù)
soring:調(diào)用的方法
cv:交叉驗(yàn)證生成器或可迭代的次數(shù)
n_jobs:同時(shí)工作的cpu個(gè)數(shù)(-1代表全部)
verbose:詳細(xì)程度
fit_params:傳遞給估計(jì)器的擬合方法的參數(shù)
pre_dispatch:控制并行執(zhí)行期間調(diào)度的作業(yè)數(shù)量。減少這個(gè)數(shù)量對(duì)于避免在CPU發(fā)送更多作業(yè)時(shí)CPU內(nèi)存消耗的擴(kuò)大是有用的。該參數(shù)可以是:
1)沒(méi)有,在這種情況下,所有的工作立即創(chuàng)建并產(chǎn)生。將其用于輕量級(jí)和快速運(yùn)行的作業(yè),以避免由于按需產(chǎn)生作業(yè)而導(dǎo)致延遲
2)一個(gè)int,給出所產(chǎn)生的總工作的確切數(shù)量
3)一個(gè)字符串,給出一個(gè)表達(dá)式作為n_jobs的函數(shù),如'2 * n_jobs'
調(diào)參:
1)scoring='accuracy'
import matplotlib.pyplot as plt
###設(shè)置n_neighbors的值為1到30,通過(guò)繪圖來(lái)看訓(xùn)練分?jǐn)?shù)###
k_range=range(1,31)
k_scores=[]
for k in k_range:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#for classfication
k_scores.append(scores.mean())
plt.plot(k_range,k_scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('CrossValidation accuracy')
plt.show()

我們可以看到n_neighbor在12-18之間評(píng)分比較高,實(shí)際項(xiàng)目之中我們可以通過(guò)這種方式來(lái)選擇不同參數(shù)。
2)scoring='neg_mean_squared_error'
選擇誤差最小的范圍
loss=-cross_val_score(knn,X,y,cv=10,scoring='neg_mean_squared_error')#for regression
k_scores.append(loss.mean())

7、過(guò)擬合
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
#引入數(shù)據(jù)集
digits=load_digits()
X=digits.data
y=digits.target
#學(xué)習(xí)曲線(learning curve)來(lái)判斷模型狀態(tài):過(guò)擬合欠擬合
train_sizes,train_loss,test_loss=learning_curve(
SVC(gamma=0.001),X,y,cv=10,scoring='neg_mean_squared_error',
train_sizes=[0.1,0.25,0.5,0.75,1]
)
train_loss_mean=-np.mean(train_loss,axis=1)
test_loss_mean=-np.mean(test_loss,axis=1)
#將每一步進(jìn)行打印出來(lái)
plt.plot(train_sizes,train_loss_mean,'o-',color='r',label="Training")
plt.plot(train_sizes,test_loss_mean,'o-',color='g',label="'Cross-validation")
plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

【說(shuō)明】
learning_curve(estimator, X, y, train_sizes=array([ 0.1 , 0.325, 0.55 , 0.775, 1. ]), cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=1, pre_dispatch='all', verbose=0)
學(xué)習(xí)曲線是不同訓(xùn)練集大小,模型在訓(xùn)練集和驗(yàn)證集上的得分變化曲線。以樣本數(shù)為橫坐標(biāo),訓(xùn)練和交叉驗(yàn)證集上的得分(如準(zhǔn)確率)為縱坐標(biāo)。
learning curve可以幫助我們判斷模型現(xiàn)在所處的狀態(tài):過(guò)擬合or 欠擬合
參數(shù):
estimator:所使用的分類(lèi)器
X:array-like, shape (n_samples, n_features)
訓(xùn)練向量,n_samples是樣本的數(shù)量,n_features是特征的數(shù)量
y:array-like, shape (n_samples) or (n_samples, n_features), optional
目標(biāo)相對(duì)于X分類(lèi)或者回歸
train_sizes:array-like, shape (n_ticks,), dtype float or int
訓(xùn)練樣本的相對(duì)的或絕對(duì)的數(shù)字,這些量的樣本將會(huì)生成learning curve。如果dtype是float,他將會(huì)被視為最大數(shù)量訓(xùn)練集的一部分(這個(gè)由所選擇的驗(yàn)證方法所決定)。否則,他將會(huì)被視為訓(xùn)練集的絕對(duì)尺寸。要注意的是,對(duì)于分類(lèi)而言,樣本的大小必須要充分大,達(dá)到對(duì)于每一個(gè)分類(lèi)都至少包含一個(gè)樣本的情況。
cv :int, cross-validation generator or an iterable, optional
確定交叉驗(yàn)證的分離策略
--None,使用默認(rèn)的3-fold cross-validation,
--integer,確定是幾折交叉驗(yàn)證
--一個(gè)作為交叉驗(yàn)證生成器的對(duì)象
--一個(gè)被應(yīng)用于訓(xùn)練/測(cè)試分離的迭代器
n_jobs : 整數(shù),可選并行運(yùn)行的作業(yè)數(shù)(默認(rèn)值為1)。windows開(kāi)多線程需要在"name"==main中運(yùn)行。
verbose : integer, optional
控制冗余:越高,有越多的信息
返回值:
train_sizes_abs:array, shape = (n_unique_ticks,), dtype int
用于生成learning curve的訓(xùn)練集的樣本數(shù)。由于重復(fù)的輸入將會(huì)被刪除,所以ticks可能會(huì)少于n_ticks.
train_scores : array, shape (n_ticks, n_cv_folds)
在訓(xùn)練集上的分?jǐn)?shù)
test_scores : array, shape (n_ticks, n_cv_folds)
在測(cè)試集上的分?jǐn)?shù)
調(diào)參:gamma=0.1
那么會(huì)改變相應(yīng)的Loss函數(shù)。損失函數(shù)便在10左右停留,能直觀的看出過(guò)擬合。

通過(guò)修改gamma參數(shù)來(lái)修正過(guò)擬合問(wèn)題。
from sklearn.model_selection import validation_curve#將learning_curve改為validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
#引入數(shù)據(jù)集
digits=load_digits()
X=digits.data
y=digits.target
#改變param范圍來(lái)觀察Loss函數(shù)情況
param_range=np.logspace(-6,-2.3,5)
train_loss,test_loss=validation_curve(
SVC(),X,y,param_name='gamma',param_range=param_range,cv=10,
scoring='neg_mean_squared_error')
train_loss_mean=-np.mean(train_loss,axis=1)
test_loss_mean=-np.mean(test_loss,axis=1)
plt.plot(param_range,train_loss_mean,'o-',color='r',label='Training')
plt.plot(param_range,test_loss_mean,'o-',color='g',label='Cross-validation')
plt.xlabel('gamma')
plt.ylabel('loss')
plt.legend(loc='best')
plt.show()

如果gamma的值大于0.001便會(huì)出現(xiàn)過(guò)擬合的問(wèn)題,那么我們構(gòu)建模型時(shí)gamma參數(shù)設(shè)置應(yīng)該小于0.001。
9.保存模型
先將model保存起來(lái),然后可以很方便的將模型遷移。
from sklearn import svm
from sklearn import datasets
#引入數(shù)據(jù)集,定義模型,訓(xùn)練數(shù)據(jù)
iris=datasets.load_iris()
X,y=iris.data,iris.target
clf=svm.SVC()
clf.fit(X,y)
#引入sklearn中自帶的保存模塊
from sklearn.externals import joblib
#保存model
joblib.dump(clf,'sklearn_save/clf.pkl')
#重新加載model,只有保存一次后才能加載model
clf3=joblib.load('sklearn_save/clf.pkl')
print(clf3.predict(X[0:1]))
#存放model能夠更快的獲得以前的結(jié)果