Python機器學習

在docker裏整了一個Anaconda鏡像還挺大,參考文章 https://elitedatascience.com/python-machine-learning-tutorial-scikit-learnpython

導入numpy,它提供了對更高效的數值計算的支持;導入Pandas,一個支持數據框的便利庫。Scikit-Learn能夠直接處理數字矩陣。 import numpy as np 改變被導入模組在當前模組中的名稱。和import some other = some同樣效果。算法

開始導入機器學習功能了。來自model_selection模塊的train_test_split()函數。這個模塊包含了不少能夠幫助咱們在模型之間進行選擇的工具。 建議用戶儘量多的使用絕對導入,防止混淆使用同名模塊。from sklearn.model_selection import train_test_splitdocker

導入整個預處理模塊。這包含用於縮放,轉換和刻錄數據的實用程序。.表明當前目錄,..表明上一層目錄,...表明上上層目錄。 from sklearn import preprocessing數組

模型「家族」和實際模型之間有什麼區別? 一個「家族」模型是普遍的模型類型,如隨機森林,支持向量機,線性迴歸模型等。在每一個模型族中,在擬合併調整其參數後,將獲得一個實際模型。dom

導入隨機森林家族。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。Joblib是Python的pickle包的替代品,它能更有效地存儲大的numpy數組。學習

加載紅葡萄酒數據。加載數據集。Pandas庫加載了一整套有用的導入/輸出工具。能夠從CSV,Excel,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)。查看數據 print data.head()。看到CSV文件其實是使用分號分隔數據。很容易解決。修改成data = pd.read_csv(dataset_url, sep=';')。查看數據 print data.head()。發現已經分隔好了。查看數據特徵print data.shape。打印一些彙總統計。print data.describe()。

全部功能的列表:

質量(目標)。 固定酸度。 揮發酸度。 檸檬酸。 殘糖。 氯化物。 遊離二氧化硫。 總二氧化硫。 密度。 pH值。 硫酸鹽。 醇。

這些值是數字的,方便處理。它們有一些很是不一樣的單位,留心之後再標準化數據。。剛開始認知階段。此過程大量減小了一般建議的探索性數據分析。

將數據分解爲訓練和測試集

將數據分解到建模工做流程開始時的訓練和測試集對於得到對模型性能的現實估計相當重要。 首先,將咱們的目標(y)特徵與咱們的輸入(X)特徵分開: y = data.quality X = data.drop('quality', axis=1)

使得可以利用Scikit-Learn的train_test_split函數:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123, stratify=y)

將把20%的數據做爲一個測試集來評估模型。設置了一個隨機的「隨機狀態」(aka種子),以即可以重現結果。 最後,按目標變量對 進行分層是一種很好的作法。這將確保訓練集與測試集類似,從而使評估指標更加可靠。

聲明數據預處理步驟。 標準化是從每一個特徵中減去均值,而後除以特徵標準差的過程。標準化是機器學習任務的通用要求。許多算法假定全部特徵都以零爲中心,並具備大體相同的方差。 Scikit-Learn使數據預處理變得垂手可得。如縮放數據集X_train_scaled = preprocessing.scale(X_train)。數據集確實以0爲中心,單位方差print X_train_scaled.mean(axis=0),print X_train_scaled.std(axis=0)。

公平地表示包括預處理步驟在內的模型對新的數據執行。預處理代碼 :不是直接調用scale函數,而是使用Scikit-Learn中的一個名爲Transformer API的特性,容許使用訓練數據「適合」預處理步驟。而後在將來的數據集上使用相同的轉換。

過程的樣子:

將變換安裝在訓練集上(保存平均值和標準誤差) 將變換應用於訓練集(縮放訓練數據) 將變壓應用於測試裝置(使用相同的方法和標準誤差)

使得對模型性能的最終評估更加真實,而且容許將預處理步驟插入到 交叉驗證管道中。

代碼:scaler = preprocessing.StandardScaler().fit(X_train)如今縮放對象具備訓練集中每一個特徵的已保存的平均值和標準誤差。確認X_train_scaled = scaler.transform(X_train),print X_train_scaled.mean(axis=0),print X_train_scaled.std(axis=0)。

注意如何使用縮放對象並使用它來轉換訓練集。可使用用於轉換訓練集的徹底相同的方法和標準差來轉換測試集:X_test_scaled = scaler.transform(X_test),print X_test_scaled.mean(axis=0),print X_test_scaled.std(axis=0),

注意測試集中縮放的特徵如何不徹底以零爲單位,以單位方差爲中心!正是咱們指望的,由於咱們正在使用訓練集中的方法來轉換測試集,而不是測試集自己。創建交叉驗證流水線時,甚至不須要手動配合Transformer API。簡單地聲明類對象,pipeline = make_pipeline(preprocessing.StandardScaler(), RandomForestRegressor(n_estimators=100))。

一個建模流水線,首先使用StandardScaler()轉換數據,而後使用隨機森林迴歸器來擬合模型。

聲明超參數調整。 如今是考慮要調整模型的超參數的時候了。有兩種類型的參數須要咱們擔憂:模型參數和超參數。模型參數能夠直接從數據中學習(即迴歸係數),而超參數則不能。超參數表示關於模型的「更高級別」結構信息,而且一般在訓練模型以前設置它們。

隨機森林超參數。隨機森林進行迴歸:在每一個決策樹,計算機能夠憑經驗決定在哪裏建立基於分支或者 均方偏差(MSE)或平均絕對偏差(MAE)。所以,實際分支位置是模型參數。該算法不知道它應該使用的兩個標準MSE或MAE中的哪個。該算法也不能肯定在森林中包括多少棵樹。這些是用戶必須設置的超參數的示例 。

列出可調超參數:print pipeline.get_params()。經過交叉驗證來聲明咱們想要調整的超參數。hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'], 'randomforestregressor__max_depth': [None, 5, 3, 1]}

使用交叉驗證管道調整模型。須要花一些時間來談論交叉驗證。機器學習中最重要的技能之一,由於它能夠幫助您最大化模型性能,同時減小過分擬合的機會。交叉驗證是一種經過使用相同的方法屢次訓練和評估您的模型來可靠地估計構建模型的方法的性能的過程 。實際上,這個「方法」僅僅是一組超參數。

步驟:

將數據分紅 k個 相等的部分,或「摺疊」(一般k = 10)。 訓練模型 k -1倍(例如前9倍)。 在剩餘的「保留」倍數(例如第10倍)上進行評估。 執行步驟(2)和(3) k次,每次進行不一樣的摺疊。 彙總全部k次摺疊的表現。這是績效指標。

爲何交叉驗證在機器學習中很重要?假設你想訓練一個隨機的森林退化者。必須調整的超參數之一是森林中每一個決策樹所容許的最大深度。你怎麼決定?這就是交叉驗證的用武之地。只使用訓練集,可使用CV來評估不一樣的超參數並估計其有效性。當準備好選擇模型時,能夠保持測試集「無污染」,並將其保存爲真正的保留評估。能夠僅使用訓練集來調整隨機森林模型,線性迴歸模型和k最近鄰模型,。而後,你仍然有沒有被污染的測試集,讓你在模型族之間進行最後的選擇!

當執行CV是最好的作法,包括數據預處理步驟中的交叉確認循環。這能夠防止您的訓練褶皺與您的測試褶皺有影響的數據。

預處理步驟的CV流水線以下:

將數據分紅 k個 相等的部分,或「摺疊」(一般k = 10)。 預處理 k -1訓練摺疊。 訓練你的模型在相同的 k -1摺疊。 使用與步驟(2)相同的轉換對預留摺疊進行預處理。 在相同的保留摺疊評估您的模型。 執行步驟(2) - (5) k次,每次進行不一樣的摺疊。 彙總全部k次摺疊的表現。這是績效指標。

Scikit-Learn使得設置起來很是簡單。clf = GridSearchCV(pipeline, hyperparameters, cv=10)。clf.fit(X_train, y_train)。GridSearchCV本質上是對整個「網格」(全部可能的排列)的超參數進行交叉驗證。 能夠看到使用CV發現的最佳參數集合: print clf.best_params_

改裝整個訓練集。

在使用交叉驗證適當調整了超參數以後,經過在整個訓練集上從新設置模型,一般能夠得到較小的性能提高。sklearn中的GridSearchCV將使用整個訓練集合自動從新設置具備最佳超參數集合的模型。此功能默認爲開啓print clf.refit。當將其應用於其餘數據集時,能夠簡單地使用 clf對象做爲模型。

評估測試數據的模型管道。用於調整超參數的clf對象也能夠像模型對象同樣直接使用。如何預測一組新的數據:y_pred = clf.predict(X_test)。可使用以前導入的度量來評估咱們的模型性能: print r2_score(y_test, y_pred)。print mean_squared_error(y_test, y_pred)。

.. 這個表現夠好嗎?經驗法則是,你的第一個模型可能不會是最好的模型。可是,咱們推薦三種策略的組合來決定您對模型性能是否滿意。

從模型的目標開始。若是模型與業務問題相關聯,那麼您是否成功地解決了這個問題? 查看學術文獻,瞭解特定類型數據的當前性能基準。 嘗試從改善模型的方式上找到低懸的成果。

如何提升模型的性能,可是這裏有一些快速的嘗試:

嘗試其餘迴歸模型族(例如正則化迴歸,加強樹木等)。 收集更多的數據,若是這樣作很便宜。 花費更多時間進行探索性分析後,設計更智能的功能。 與領域專家交談,以得到更多的背景(...這是一個品酒的好藉口!)。

當嘗試其餘系列的模型時,咱們建議使用與隨機森林模型相同的訓練和測試集。這是在模型之間進行真正的比較的最佳方式。

保存模型以供未來使用。 joblib.dump(clf, 'rf_regressor.pkl')。想再次加載模型時,只需使用這個函數:clf2 = joblib.load('rf_regressor.pkl')。clf2.predict(X_test)。

有個問題。。機器學習寫了這麼長,,得出倆數來,,學出啥來了。。是幹啥使的。咋回事類。

相關文章
相關標籤/搜索