當特征的數值范圍差距較大時,需要對特征的數值進行歸一化,防止某些屬性的權重過大。(有時不需特征歸一化)
from sklearn import preprocessingimport numpy as npx1 = np.random.randint(0,10,1000).reshape((1000,1))x2 = np.random.randint(0,100,1000).reshape((1000,1))x3 = np.random.randint(0,10000,1000).reshape((1000,1))X = np.concatenate([x1,x2,x3],axis=1)print X[:4][[ 0 78 3423] [ 7 35 963] [ 7 63 9945] [ 3 60 6516]]# 特征數值歸一化print preprocessing.scale(X)[:4][[-1.59232736 0.96948157 -0.56718281] [ 0.83236081 -0.55950092 -1.40672255] [ 0.83236081 0.43611559 1.65862133] [-0.55317529 0.32944239 0.48838484]驗證歸一化的重要性# 生成分類數據進行驗證from sklearn import datasetsimport matplotlib.pyplot as plt%matplotlib inline# 生成分類數據:# n_sample:樣本個數、n_features:類別標簽種類數X, y = datasets.make_classification(n_samples=300, n_features=2, n_redundant=0, n_informative=2, random_state=25, n_clusters_per_class=1, scale=100)plt.scatter(X[:,0], X[:,1], c=y)plt.show()
在分割訓練集和測試集后,測試集一般用于對最后選擇的模型進行評分。而在選擇模型的超參數的過程中,為驗證/評價模型的好壞,需要在訓練集中取出一定比例的樣本作為驗證集來評價某個模型的好壞,訓練集中的其他樣本用來訓練模型。
為消除所選出來的驗證集中的樣本的特殊性,則需要將訓練集中的每一份樣本作為驗證集,其他樣本作為訓練集來訓練模型。若將訓練集中的樣本分為N分,最后會得到N個對該模型的評分,對這些評分取均值,即得到了交叉驗證的評分。
交叉驗證一般用來調整模型的超參數。
sklearn中的交叉驗證
cross_val_score函數用于交叉驗證,返回各個驗證集的評價得分。
from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scoreimport matplotlib.pyplot as plt%matplotlib inlineiris = datasets.load_iris()X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=5)以KNN模型為例# 使用KNN模型進行預測(K為超參數)from sklearn.neighbors import KNeighborsClassifier# 超參數K的范圍k_range = range(1,31)# 交叉驗證的評分集合cv_scores = []for k in k_range: knn = KNeighborsClassifier(k) # 構造模型 # 將訓練集均分為10份 #cv: 交叉驗證迭代器 scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy') # 分類問題使用 #scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='neg_mean_squared_error') # 回歸問題使用 cv_scores.append(scores.mean()) # # print cv_scores# 可視化各個k值模型的交叉驗證的平均分plt.plot(k_range,cv_scores)plt.xlabel('k')plt.ylabel('Accuracy')plt.show()
過擬合:模型對于訓練集數據擬合程度過當,以致太適合訓練集數據而無法適應一般情況。即訓練出來的模型在訓練集上表現很好,在驗證集/測試集上表現并不好。
欠擬合:模型在訓練集/測試集上都表現得不是很好。
# 加載數據from sklearn.model_selection import learning_curvefrom sklearn.svm import SVCimport numpy as npdigits = datasets.load_digits()X = digits.datay = digits.target欠擬合情況# 繪制學習曲線(學習曲線:在不同訓練數據量下對訓練出來的模型進行評分)# gamma = 0.001train_sizes, train_scores, val_scores = learning_curve( SVC(gamma=0.001), X, y, cv=10, scoring='accuracy', train_sizes=[0.1, 0.25, 0.5, 0.75, 1])# train_sizes: 每次模型訓練的數量# train_scores: 每次模型在訓練集上的評分# val_scores:每次模型在驗證集上的交叉驗證評分# 求不同訓練數據量下的評分的均值train_scores_mean = np.mean(train_scores, axis=1) # 行均值val_scores_mean = np.mean(val_scores, axis=1)# 繪制學習曲線plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='training')plt.plot(train_sizes, val_scores_mean, '*-', color='g', label='cross validation')plt.xlabel('training sample size')plt.ylabel('accuracy')plt.legend(loc='best')plt.show()


新聞熱點
疑難解答