nyuv240類資料集_機器學習:資料劃分與交叉驗證
技術標籤:nyuv240類資料集
函式1:train_test_split
from sklearn.model_selection import train_test_split # 資料劃分所需的函式 X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.4, random_state=0) # 劃分訓練集和測試集.test_size為測試集所佔的比例 print('訓練集大小:',X_train.shape,y_train.shape) # 訓練集樣本大小 print('測試集大小:',X_test.shape,y_test.shape) # 測試集樣本大小
train_test_split 函式用於隨機劃分訓練集和測試集的函式,其中引數:
- train_data:樣本特徵集
- train_target:樣本的標籤集
- test_size:樣本佔比,測試集佔資料集的比重,如果是整數的話就是樣本的數量
- random_state:是隨機數的種子。在同一份資料集上,相同的種子產生相同的結果,不同的種子產生不同的劃分結果
- x_train,y_train:構成了訓練集
- x_test,y_test:構成了測試集
此外,該函式還存在一個引數stratify:是為了保持split前類的分佈。比如有100個數據,80個屬於A類,20個屬於B類。如果train_test_split(test_size=0.25, stratify = y_all), 那麼split之後資料如下:
testing: 25個數據,其中20個屬於A類,5個屬於B類。
用了stratify引數,training集和testing集的類的比例是 A:B= 4:1,等同於split前的比例(80:20)。通常在這種類分佈不平衡的情況下會用到stratify。
函式2:StandardScaler
# 如果涉及到歸一化,則在測試集上也要使用訓練集模型提取的歸一化函式。 from sklearn import preprocessing # 預處理模組 scaler = preprocessing.StandardScaler().fit(X_train) # 通過訓練集獲得歸一化函式模型,在訓練集和測試集上都使用這個歸一化函式 X_train_transformed = scaler.transform(X_train) clf = svm.SVC(kernel='linear', C=1).fit(X_train_transformed, y_train) # 使用訓練集訓練模型 X_test_transformed = scaler.transform(X_test) print(clf.score(X_test_transformed, y_test)) # 計算測試集的度量值(準確度) 可見歸一化後結果未必好
為什麼要進行歸一化?
- 歸一化後加快了梯度下降求最優解的速度;如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。
- 歸一化有可能提高精度;一些分類器需要計算樣本之間的距離(如歐氏距離)如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。
哪些機器學習演算法不需要(需要)做歸一化?
概率模型(樹形模型)不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率,如決策樹、RF。而像Adaboost、SVM、LR、Knn、KMeans之類的最優化問題就需要歸一化。
歸一化方法
作用:去均值和方差歸一化,且是針對每一個特徵維度來做的,而不是針對樣本。 標準差標準化(standardScale)使得經過處理的資料符合標準正態分佈,即均值為0,標準差為1,其轉化函式為:該值減去均值除以標準差!
其他的歸一化型別
- 線性歸一化
這種歸一化方法比較適用在數值比較集中的情況。缺陷:如果max和min不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。實際使用中可以用經驗常量值來替代max和min。
- 非線性歸一化
經常用在資料分化比較大的場景,有些數值很大,有些很小。通過一些數學函式,將原始值進行對映。該方法包括 log、指數,正切等。需要根據資料分佈的情況,決定非線性函式的曲線
函式3:
# ===================================直接呼叫交叉驗證評估模型==========================
from sklearn.model_selection import cross_val_score # 交叉驗證所需的函式
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
#引數分別是:模型,資料,標籤,迭代次數
print(scores) # 列印輸出每次迭代的度量值(準確度)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2)) # 獲取置信區間。(也就是均值和方差)
交叉驗證優點:
1:交叉驗證用於評估模型的預測效能,尤其是訓練好的模型在新資料上的表現,可以在一定程度上減小過擬合。
2:還可以從有限的資料中獲取儘可能多的有效資訊。
此外還有一個KFold:
kfold是將資料集劃分為K-折,只是劃分資料集;
cross_val_score是根據模型進行計算,計算交叉驗證的結果,你可以簡單認為就是cross_val_score中呼叫了kfold進行資料集劃分。