一、擬合和預測:估算器基礎
1.1 資源匯入、樣本定義和訓練
from sklearn.ensemble import RandomForestClassifier #隨機森林分類器 """ random_state=0 將使用固定的隨機數種子(在這個例子中是0)來初始化隨機數生成器。 這樣,無論你的程式碼執行多少次,只要資料集和其他引數保持不變,模型的訓練過程和結果都將是相同的。 """ clf = RandomForestClassifier(random_state=0) X = [ [ 1, 2, 3], #2個樣本,3個特徵 [11, 12, 13] ] y = [0, 1] #每一個樣本的類別 clf.fit(X, y) #訓練
【輸出】:
RandomForestClassifier
RandomForestClassifier(random_state=0)
1.2 預測
clf.predict(X) # 預測訓練資料的標籤
【輸出2】:
array([0, 1])
1.3 新資料預測
clf.predict([[4, 5, 6], [14, 15, 16]]) # 預測新資料的標籤
【輸出3】:
array([0, 1])
【結論】:估算器擬合後,可用於預測新資料的目標值。你無需重新訓練估算器
二、轉換器和前處理器
#StandardScaler主要作用是將資料的均值調整為0,同時將資料的標準差調整為1 from sklearn.preprocessing import StandardScaler X = [[0, 15],[1, -10]] StandardScaler().fit(X).transform(X)
【輸出】
array([[-1., 1.], [ 1., -1.]])
【結論】:轉換物件沒有預測方法,但是需要有一個輸出新轉換的樣本矩陣X的轉換方法:
三、管道:連線前處理器和估算器
3.1 資源匯入、建立管道、資料拆分及訓練
#案例:我們載入Iris資料集,將其分為訓練集和測試集,然後根據測試資料計算管道的準確性得分: #對資料進行標準化處理標準化是將特徵縮放到給定的範圍(通常是均值為0,標準差為1)的過程 from sklearn.preprocessing import StandardScaler # 邏輯迴歸 from sklearn.linear_model import LogisticRegression """ make_pipeline 函式可以將多個轉換器和估計器(比如 StandardScaler、PCA、LogisticRegression 等) 按照順序連線起來,形成一個機器學習管道, make_pipeline 函式自動為每個步驟分配名稱(比如第一個步驟會被命名為 standardscaler,第二個步驟會被命名為 pca), 並將它們按照順序連線起來 """ from sklearn.pipeline import make_pipeline # 鳶尾花資料集 from sklearn.datasets import load_iris """ train_test_split函式接收多個引數,其中最重要的引數是原始資料集X和目標變數y, 以及測試集的大小test_size(通常為0.2或0.3) 。函式會根據test_size的比例自動將原始資料集劃分為訓練集和測試集, 劃分是隨機進行的,保證了訓練集和測試集的樣本分佈與原始資料集相似。 """ from sklearn.model_selection import train_test_split #用於計算分類模型的準確率 # 它可以用來計算分類模型在測試集上的準確度,即分類正確的樣本數佔總樣本數的比例 from sklearn.metrics import accuracy_score # 建立一個pipeline物件 pipe = make_pipeline( StandardScaler(), LogisticRegression(random_state=0) ) # 載入鳶尾花資料集並將其切分成訓練集和測試集 X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) #訓練整個pipeline pipe.fit(X_train, y_train)
【輸出】:
3.2 計算模型預測準確率
# 我們現在可以像使用其他任何估算器一樣使用它,計算模型在測試資料集上的預測準確率。 accuracy_score(pipe.predict(X_test), y_test)
【輸出】:
0.9736842105263158
【結論】:管道還可以防止資料洩漏,即在訓練資料中洩露一些測試資料。
四、模型評估,即交叉驗證
# 建立合成的迴歸資料集 from sklearn.datasets import make_regression #線性迴歸用於描述一個連續型因變數和一系列自變數之間的關係 from sklearn.linear_model import LinearRegression """ (交叉驗證)是一種用於評估模型效能的技術 交叉驗證透過將資料集分割成多個小部分,然後多次對模型進行訓練和驗證的過程, 來評估模型的泛化能力和效能。這種方法主要用於防止模型過於複雜而引起的過擬合, 並透過多次進行這個過程來評估模型的泛化效能和穩定性。交叉驗證不僅可以幫助評估統計分析、 機器學習演算法對獨立於訓練資料的資料集的泛化能力,還能確保訓練集和測試集的比例適當,以滿足模型的評估需求。 """ from sklearn.model_selection import cross_validate X, y = make_regression(n_samples=1000, random_state=0) lr = LinearRegression() result = cross_validate(lr, X, y) # 預設為5折交叉驗證 result['test_score'] # 此處R2得分很高的原因為資料集很簡單
【輸出】:
array([1., 1., 1., 1., 1.])
【結論】:用一些資料來訓練模型並不意味著在一些未知的資料上也能預測得很好,因此需要對模型進行評估
五、自動引數搜尋
5.1資源匯入,建立隨機搜尋物件,及完成訓練
""" 加利福尼亞的房價資料,房價作為目標變數(target) 這個資料集包含了20640個樣本,每個樣本有8個屬性表示(所有屬性值均為數字), """ from sklearn.datasets import fetch_california_housing #隨機森林迴歸 from sklearn.ensemble import RandomForestRegressor #隨機化搜尋,即超引數最佳化方法 from sklearn.model_selection import RandomizedSearchCV """ train_test_split函式接收多個引數,其中最重要的引數是原始資料集X和目標變數y, 以及測試集的大小test_size(通常為0.2或0.3) 。函式會根據test_size的比例自動將原始資料集劃分為訓練集和測試集, 劃分是隨機進行的,保證了訓練集和測試集的樣本分佈與原始資料集相似。 """ from sklearn.model_selection import train_test_split #用於生成一個指定範圍內的隨機整數 from scipy.stats import randint X, y = fetch_california_housing(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 定義要搜尋的引數空間 param_distributions = {'n_estimators': randint(1, 5), 'max_depth': randint(5, 10)} # 現在建立一個searchCV 物件然後用資料訓練它 search = RandomizedSearchCV( estimator=RandomForestRegressor(random_state=0), n_iter=5, param_distributions=param_distributions, random_state=0) search.fit(X_train, y_train)
【輸出】:
5.2 儲存最佳引數組合
#搜尋,最佳引數組合,以便後續使用這些引數來訓練模型,或者在模型調優過程中作為參考 # 搜尋物件現在就像普通的隨機森林估計器一樣 # max_depth=9 和 n_estimators=4 search.best_params_
【輸出】:
{'max_depth': 9, 'n_estimators': 4}
5.3 模型效能評估
""" 評估模型的效能 這個函式用於計算模型在測試集上的預測準確率, 即模型對測試資料(X_test,特徵資料)進行預測後,與真實標籤(y_test)進行比較, 計算預測正確的比例。這種方法適用於分類問題,其中預測結果和真實標籤都是類別標籤。 準確率是評估分類模型效能的一個基本指標,它反映了模型對未見資料的適應能力。 然而,對於更復雜的評估需求,可能需要計算其他指標,如精確率、召回率和F1分數等,以獲得更全面的效能評 """ search.score(X_test, y_test)
【輸出】:
0.735363411343253