K折交叉驗證
通過測試、驗證,進而評估你的算法是否能夠做你想做的。
sklearn中的K折交叉驗證
可通過簡單的方式隨機化 Sklearn k 折 CV 中的事件,就是將 shuffle 標誌設置爲 true。
之後,代碼將從如下所示:
cv = KFold( len(authors), 2 )
可變爲如下所示:
cv = KFold( len(authors), 2, shuffle=True )
shuffle=True 可避免所有某一特定類型的事件都屬於訓練集,而另一特定類型的事件則屬於測試集,在這種情況下,針對一種類型事件的訓練不會幫助我們成功地對另一類型的事件進行分類
from sklearn.cross_validation import KFold
t0= time()
cv = KFold( len(authors), 2, shuffle=True ) #將 shuffle 標誌設置爲 true來隨機化 Sklearn K-fold cross validation 中的事件
for train_indices,test_indices in kf:
# make training and testing datasets
features_train = [word_data[ii] for ii in train_indices] #利用索引進入特徵和標籤
features_test = [word_data[ii] for ii in test_indices]
authors_train = [authors[ii] for ii in train_indices]
authors_test = [authors[ii] for ii in train_indices]
# TFIDF and feature selection
vectorizer = TfidfVectorizer(sublinear_tf = True,max_df=0.5,
stop_words = 'english')
feature_train_transformed = vectorizer.fit_transform(features_train)
feature_test_transformed = vectorizer.transform(features_test)
selector = SelectPercentile(f_classif,percentile = 10)
selector.fit(features_train_transformed,authors_train)
features_train_transformed = selector.transform(features_train_transformed).toarray()
features_test_transformed = selector.transform(features_test_transformed).toarray()
clf = GaussianNB()
clf.fit(features_train_transformed,authors_train)
print "training time:" ,round(time() - t0,3),'s'
t0=time()
pred = clf.predict(features_test_transfomed)
print "predicting time",round(time() - t0,3),'s'
acc = accuracy_score(pred,authors_test)
print "accuracy:", round(acc,3)
sklearn中的GridSearchCV
GridSearchCV 用於系統地遍歷多種參數組合,通過交叉驗證確定最佳效果參數。它的好處是,只需增加幾行代碼,就能遍歷多種組合。
下面是來自 sklearn 文檔 的一個示例:
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svr = svm.SVC()
clf = grid_search.GridSearchCV(svr, parameters)
clf.fit(iris.data, iris.target)
讓我們逐行進行說明。
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
參數字典以及他們可取的值。在這種情況下,他們在嘗試找到 kernel(可能的選擇爲 ‘linear’ 和 ‘rbf’ )和 C(可能的選擇爲1和10)的最佳組合。
這時,會自動生成一個不同(kernel、C)參數值組成的“網格”:
('rbf', 1) ('rbf', 10)
('linear', 1) ('linear', 10)
各組合均用於訓練 SVM,並使用交叉驗證對錶現進行評估。
svr = svm.SVC()
這與創建分類器有點類似,就如我們從第一節課一直在做的一樣。但是請注意,“clf” 到下一行纔會生成—這兒僅僅是在說採用哪種算法。另一種思考方法是,“分類器”在這種情況下不僅僅是一個算法,而是算法加參數值。請注意,這裏不需對 kernel 或 C 做各種嘗試;下一行才處理這個問題。
clf = grid_search.GridSearchCV(svr, parameters)
這是第一個不可思議之處,分類器創建好了。 我們傳達算法 (svr) 和參數 (parameters) 字典來嘗試,它生成一個網格的參數組合進行嘗試。
clf.fit(iris.data, iris.target)
第二個不可思議之處。 擬合函數現在嘗試了所有的參數組合,並返回一個合適的分類器,自動調整至最佳參數組合。現在您便可通過 clf.best_params_ 來獲得參數值。
SVM 的哪些參數使用特徵臉示例中的 GridSearchCV 進行自動調諧?
C和gamma
你的首個(過擬合)POI 標識符的準確度是多少?
將先開始構建想象得到的最簡單(未經過驗證的)POI 識別符。 本節課的初始代碼 (validation/validate_poi.py) 相當直白——它的作用就是讀入數據,並將數據格式化爲標籤和特徵的列表。 創建決策樹分類器(僅使用默認參數),在所有數據(你將在下一部分中修復這個問題!)上訓練它,並打印出準確率。 這是一顆過擬合樹,不要相信這個數字!儘管如此,準確率是多少?
import pickle
import sys
sys.path.append("../tools/")
from feature_format import featureFormat, targetFeatureSplit
sort_keys = '../tools/python2_lesson13_keys.pkl'
data_dict = pickle.load(open("../final_project/final_project_dataset.pkl", "r") )
### first element is our labels, any added elements are predictor
### features. Keep this the same for the mini-project, but you'll
### have a different feature list when you do the final project.
features_list = ["poi", "salary"]
data = featureFormat(data_dict, features_list)
labels, features = targetFeatureSplit(data)
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(features, labels)
pred_dt = clf.predict(features)
from sklearn.metrics import accuracy_score
acc_dt = accuracy_score(pred_dt, labels)
print acc_dt # 0.989473684211
適當部署的測試範圍的準確度
現在,你將添加訓練和測試,以便獲得一個可靠的準確率數字。 使用 sklearn.cross_validation 中的 train_test_split 驗證; 將 30% 的數據用於測試,並設置 random_state 參數爲 42(random_state 控制哪些點進入訓練集,哪些點用於測試;將其設置爲 42 意味着我們確切地知道哪些事件在哪個集中; 並且可以檢查你得到的結果)。更新後的準確率是多少?
適當部署的測試範圍的準確度是多少?
import pickle
import sys
sys.path.append("../tools/")
from feature_format import featureFormat, targetFeatureSplit
sort_keys = '../tools/python2_lesson13_keys.pkl'
data_dict = pickle.load(open("../final_project/final_project_dataset.pkl", "r") )
### first element is our labels, any added elements are predictor
### features. Keep this the same for the mini-project, but you'll
### have a different feature list when you do the final project.
features_list = ["poi", "salary"]
data = featureFormat(data_dict, features_list)
labels, features = targetFeatureSplit(data)
from sklearn i
mport tree
from sklearn.model_selection import train_test_split
features_train, features_test, labels_train, labels_test = \
train_test_split(features, labels, test_size = 0.3, random_state = 42)
clf = tree.DecisionTreeClassifier()
clf.fit(features_train, labels_train)
pred_dt = clf.predict(features_test)
from sklearn.metrics import accuracy_score
acc_dt = accuracy_score(pred_dt, labels_test)
print acc_dt # 0.724137931034
0.724137931034
在上次測驗中99%的準確率之後,測試數據讓我們回到了現實中