一,、選擇正確的Model基礎驗證法
- from sklearn.datasets import load_iris # iris數(shù)據(jù)集
- from sklearn.model_selection import train_test_split # 分割數(shù)據(jù)模塊
- from sklearn.neighbors import KNeighborsClassifier # K最近鄰(kNN,,k-NearestNeighbor)分類算法
-
- #加載iris數(shù)據(jù)集
- iris = load_iris()
- X = iris.data
- y = iris.target
-
- #分割數(shù)據(jù)并
- X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
-
- #建立模型
- knn = KNeighborsClassifier()
-
- #訓練模型
- knn.fit(X_train, y_train)
-
- #將準確率打印出
- print(knn.score(X_test, y_test))
- # 0.973684210526 基礎驗證的準確率
二、選擇正確的Model交叉驗證法(Cross-validation)
交叉驗證的基本思想是把在某種意義下將原始數(shù)據(jù)(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set or test set),首先用訓練集對分類器進行訓練,再利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的性能指標,。
- from sklearn.cross_validation import cross_val_score # K折交叉驗證模塊
-
- #使用K折交叉驗證模塊
- scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
-
- #將5次的預測準確率打印出
- print(scores)
- # [ 0.96666667 1. 0.93333333 0.96666667 1. ]
-
- #將5次的預測準確平均率打印出
- print(scores.mean())
- # 0.973333333333
三,、準確率和平均方差
一般來說準確率(accuracy) 會用于判斷分類(Classification)模型的好壞。
- import matplotlib.pyplot as plt #可視化模塊
-
- #建立測試參數(shù)集
- k_range = range(1, 31)
-
- k_scores = []
-
- #藉由迭代的方式來計算不同參數(shù)對模型的影響,,并返回交叉驗證后的平均準確率
- for k in k_range:
- knn = KNeighborsClassifier(n_neighbors=k)
- scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
- k_scores.append(scores.mean())
-
- #可視化數(shù)據(jù)
- plt.plot(k_range, k_scores)
- plt.xlabel('Value of K for KNN')
- plt.ylabel('Cross-Validated Accuracy')
- plt.show()
從圖中可以得知,,選擇12~18 的k 值最好,。高過18 之后,準確率開始下降則是因為過擬合(Over
fitting)的問題,。
一般來說平均方差(Mean
squared error) 會用于判斷回歸(Regression)模型的好壞,。
- import matplotlib.pyplot as plt
- k_range = range(1, 31)
- k_scores = []
- for k in k_range:
- knn = KNeighborsClassifier(n_neighbors=k)
- loss = -cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error')
- k_scores.append(loss.mean())
-
- plt.plot(k_range, k_scores)
- plt.xlabel('Value of K for KNN')
- plt.ylabel('Cross-Validated MSE')
- plt.show()
由圖可以得知,平均方差越低越好,,因此選擇13~18 左右的K 值會最好,。
四、由學習曲線(Learning Curve)來檢視過擬合(Overfitting)的問題
- from sklearn.learning_curve import learning_curve #學習曲線模塊
- from sklearn.datasets import load_digits #digits數(shù)據(jù)集
- from sklearn.svm import SVC #Support Vector Classifier
- import matplotlib.pyplot as plt #可視化模塊
- import numpy as np
加載digits數(shù)據(jù)集,,其包含的是手寫體的數(shù)字,,從0到9。數(shù)據(jù)集總共有1797個樣本,,每個樣本由64個特征組成,,
分別為其手寫體對應的8×8像素表示,每個特征取值0~16,。
- digits = load_digits()
- X = digits.data
- y = digits.target
觀察樣本由小到大的學習曲線變化, 采用K折交叉驗證 cv=10 ,
選擇平均方差檢視模型效能 scoring='mean_squared_error' ,
樣本由小到大分成5輪檢視學習曲線(10%, 25%, 50%, 75%,
100%) :
- train_sizes, train_loss, test_loss = learning_curve(
- SVC(gamma=0.001), X, y, cv=10, scoring='mean_squared_error',
- train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
-
- #平均每一輪所得到的平均方差(共5輪,,分別為樣本10%、25%,、50%,、75%、100%)
- train_loss_mean = -np.mean(train_loss, axis=1)
- test_loss_mean = -np.mean(test_loss, axis=1)
可視化圖形:
- 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()
|