1. 程式人生 > 其它 >nyuv240類資料集_機器學習:資料劃分與交叉驗證

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之後資料如下:

training: 75個數據,其中60個屬於A類,15個屬於B類。
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))  # 計算測試集的度量值(準確度) 可見歸一化後結果未必好

為什麼要進行歸一化?

  1. 歸一化後加快了梯度下降求最優解的速度;如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。
  2. 歸一化有可能提高精度;一些分類器需要計算樣本之間的距離(如歐氏距離)如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。

哪些機器學習演算法不需要(需要)做歸一化?

概率模型(樹形模型)不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率,如決策樹、RF。而像Adaboost、SVM、LR、Knn、KMeans之類的最優化問題就需要歸一化。

歸一化方法

作用:去均值和方差歸一化,且是針對每一個特徵維度來做的,而不是針對樣本。 標準差標準化(standardScale)使得經過處理的資料符合標準正態分佈,即均值為0,標準差為1,其轉化函式為:該值減去均值除以標準差!

其他的歸一化型別

  • 線性歸一化

4bbd2a1ea79cb9ec2963e7c27cca147e.png

這種歸一化方法比較適用在數值比較集中的情況。缺陷:如果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進行資料集劃分。