Python機器學習實戰專案--預測紅酒質量(超詳細)
用Scikit-Learn(sklearn)建立模型
1 環境搭建
Python 3+NumPy+Pandas+Scikit-Learn (sklearn)
2 匯入庫和模組
Numpy是比Python自身的巢狀列表(nested list structure)結構要高效的多的一種開源的數值計算擴充套件。NumPy(Numeric Python)提供了許多高階的數值程式設計工具,如:矩陣資料型別、向量處理,以及精密的運算庫。
Pandas(Python Data Analysis Library)是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函式和方法。
- import numpy as np
- import pandas as pd
- from sklearn.model_selection import train_test_split
-
from sklearn
import
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.pipeline import make_pipeline
- from sklearn.model_selection import GridSearchCV
- from sklearn.metrics import mean_squared_error,r2_score
- from sklearn.externals import joblib
3 匯入紅酒資料
Pandas為我們提供了可以讀取來自CSV、SQL、SAS等格式的資料的方法
這裡我們用其中的read_csv( )方法,可以讀取任何CSV檔案,包括來自URL 的
- dataset_url = 'http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'
- data = pd.read_csv(dataset_url)
4 把資料分解為訓練集和測試集
首先,我們將我們的目標特徵y與我們的輸入特徵X分開,然後我們利用Scikit-Learn的train_test_split函式
設定20%的資料作為測試資料
- y = data.quality
- X = data.drop( 'quality', axis= 1)
- X_train, X_test, y_train, y_test = train_test_split(X, y,
- test_size= 0.2,
- random_state= 123,
- stratify=y)
5 宣告資料預處理步驟
第三步得到的資料的精度是不一樣的,所以要把它們標準化。
標準化是機器學習任務的常見要求,許多演算法都假設所有特徵都以零為中心並具有大致相同的方差。
一個建模流水線,首先使用StandardScaler()轉換資料,然後使用隨機森林迴歸器RandomForestRegressor()擬合模型。
- pipeline = make_pipeline(preprocessing.StandardScaler(),
- RandomForestRegressor(n_estimators= 100))
6 宣告超引數
超引數是在開始學習過程之前設定值的引數,而不是通過訓練得到的引數資料。通常情況下,需要對超引數進行優化,給學習機選擇一組最優超引數,以提高學習的效能和效果。如下所見,格式應該是Python字典(鍵值對的資料結構),其中鍵是超引數名稱,值是要嘗試的設定列表,值的選項可以在文件頁面找到。
- hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],
- 'randomforestregressor__max_depth': [ None, 5, 3, 1]}
7 模型調優
交叉驗證(Cross-validation)是一種通過使用相同方法多次訓練和評估您的模型來可靠地估計構建模型的方法的效能的過程。
- clf = GridSearchCV(pipeline, hyperparameters, cv=10)
- clf.fit(X_train, y_train)
8 評估模型並預測
y_pred = clf.predict(X_test)
- print r2_score(y_test, y_pred)
- print mean_squared_error(y_test, y_pred)
完整程式碼
- # -*- coding: utf-8 -*-
- import numpy as np
- import pandas as pd
- from sklearn.model_selection import train_test_split
- from sklearn import preprocessing
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.pipeline import make_pipeline
- from sklearn.model_selection import GridSearchCV
- from sklearn.metrics import mean_squared_error,r2_score
- from sklearn.externals import joblib
- #匯入資料
- dataset_url = 'http://mlr.cs.umass.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'
- data = pd.read_csv(dataset_url,sep = ';')
- #print(data.describe())
- #把資料分為訓練集和測試集
- y = data.quality
- X = data.drop( 'quality',axis = 1)
- X_train,X_test,y_train,y_test = train_test_split(X,y,
- test_size= 0.2,
- random_state= 123,
- stratify=y)
- #宣告資料預處理步驟
- pipeline = make_pipeline(preprocessing.StandardScaler(),
- RandomForestRegressor(n_estimators= 100))
- #宣告超引數
- hyperparameters = { 'randomforestregressor__max_features' : [ 'auto', 'sqrt', 'log2'],
- 'randomforestregressor__max_depth':[ None, 5, 3, 1]}
- #優化模型
- clf = GridSearchCV(pipeline,hyperparameters,cv= 10)
- clf.fit(X_train,y_train)
- #評估模型及預測
- pred = clf.predict(X_test)
- print(r2_score(y_test, pred))
- print(mean_squared_error(y_test, pred))
詳見:https://elitedatascience.com/python-machine-learning-tutorial-scikit-learn