作者:SeanCheney Python愛好者社區專欄作者
簡書專欄:https://www.jianshu.com/u/130f76596b02
前文傳送門:
【翻譯】《利用Python進行數據分析·第2版》第1章 準備工作
【翻譯】《利用Python進行數據分析·第2版》第2章(上)Python語法基礎,IPython和Jupyter
【翻譯】《利用Python進行數據分析·第2版》第2章(中)Python語法基礎,IPython和Jupyter
【翻譯】《利用Python進行數據分析·第2版》第2章(下)Python語法基礎,IPython和Jupyter
【翻譯】《利用Python進行數據分析·第2版》第3章(上)Python的數據結構、函數和文件
【翻譯】《利用Python進行數據分析·第2版》第3章(中)Python的數據結構、函數和文件
【翻譯】《利用Python進行數據分析·第2版》第3章(下)Python的數據結構、函數和文件
【翻譯】《利用Python進行數據分析·第2版》第4章(上)NumPy基礎:數組和矢量計算
【翻譯】《利用Python進行數據分析·第2版》第4章(中)NumPy基礎:數組和矢量計算
【翻譯】《利用Python進行數據分析·第2版》第4章(下)NumPy基礎:數組和矢量計算
【翻譯】《利用Python進行數據分析·第2版》第5章(上)pandas入門
【翻譯】《利用Python進行數據分析·第2版》第5章(中)pandas入門
【翻譯】《利用Python進行數據分析·第2版》第5章(下)pandas入門
【翻譯】《利用Python進行數據分析·第2版》第6章(上) 數據加載、存儲與文件格式
【翻譯】《利用Python進行數據分析·第2版》第6章(中) 數據加載、存儲與文件格式
【翻譯】《利用Python進行數據分析·第2版》第6章(下) 數據加載、存儲與文件格式
【翻譯】《利用Python進行數據分析·第2版》第7章(上)數據清洗和準備
【翻譯】《利用Python進行數據分析·第2版》第7章(中) 數據清洗和準備
【翻譯】《利用Python進行數據分析·第2版》第7章(下) 數據清洗和準備
【翻譯】《利用Python進行數據分析·第2版》第8章(上) 數據規整:聚合、合併和重塑
【翻譯】《利用Python進行數據分析·第2版》第8章(中) 數據規整:聚合、合併和重塑
【翻譯】《利用Python進行數據分析·第2版》第9章(上) 繪圖和可視化
【翻譯】《利用Python進行數據分析·第2版》第9章(中) 繪圖和可視化
【翻譯】《利用Python進行數據分析·第2版》第9章(下) 繪圖和可視化
【翻譯】《利用Python進行數據分析·第2版》第10章(上) 數據聚合與分組運算
【翻譯】《利用Python進行數據分析·第2版》第10章(中) 數據聚合與分組運算
【翻譯】《利用Python進行數據分析·第2版》第10章(下) 數據聚合與分組運算
【翻譯】《利用Python進行數據分析·第2版》第11章(上) 時間序列
【翻譯】《利用Python進行數據分析·第2版》第11章(中) 時間序列
【翻譯】《利用Python進行數據分析·第2版》第11章(中二) 時間序列
【翻譯】《利用Python進行數據分析·第2版》第11章(下) 時間序列
【翻譯】《利用Python進行數據分析·第2版》第12章(上) pandas高級應用
【翻譯】《利用Python進行數據分析·第2版》第12章(中) pandas高級應用
【翻譯】《利用Python進行數據分析·第2版》第12章(下) pandas高級應用
【翻譯】《利用Python進行數據分析·第2版》第13章(上) Python建模庫介紹
【翻譯】《利用Python進行數據分析·第2版》第13章(中) Python建模庫介紹
【翻譯】《利用Python進行數據分析·第2版》第13章(中二) Python建模庫介紹
scikit-learn是一個廣泛使用、用途多樣的Python機器學習庫。它包含多種標準監督和非監督機器學習方法和模型選擇和評估、數據轉換、數據加載和模型持久化工具。這些模型可以用於分類、聚合、預測和其它任務。
機器學習方面的學習和應用scikit-learn和TensorFlow解決實際問題的線上和紙質資料很多。本節中,我會簡要介紹scikit-learn API的風格。
寫作此書的時候,scikit-learn並沒有和pandas深度結合,但是有些第三方包在開發中。儘管如此,pandas非常適合在模型擬合前處理數據集。
舉個例子,我用一個Kaggle競賽的經典數據集,關於鐵達尼號乘客的生還率。我們用pandas加載測試和訓練數據集:
In [86]: train = pd.read_csv('datasets/titanic/train.csv')In [87]: test = pd.read_csv('datasets/titanic/test.csv')In [88]: train[:4]Out[88]: PassengerId Survived Pclass \0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 Name Sex Age SibSp \0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S
statsmodels和scikit-learn通常不能接收缺失數據,因此我們要查看列是否包含缺失值:
In [89]: train.isnull().sum()Out[89]: PassengerId 0Survived 0Pclass 0Name 0Sex 0Age 177SibSp 0Parch 0Ticket 0Fare 0Cabin 687Embarked 2dtype: int64In [90]: test.isnull().sum()Out[90]: PassengerId 0Pclass 0Name 0Sex 0Age 86SibSp 0Parch 0Ticket 0Fare 1Cabin 327Embarked 0dtype: int64
在統計和機器學習的例子中,根據數據中的特徵,一個典型的任務是預測乘客能否生還。模型現在訓練數據集中擬合,然後用樣本外測試數據集評估。
我想用年齡作為預測值,但是它包含缺失值。缺失數據補全的方法有多種,我用的是一種簡單方法,用訓練數據集的中位數補全兩個表的空值:
In [91]: impute_value = train['Age'].median()In [92]: train['Age'] = train['Age'].fillna(impute_value)In [93]: test['Age'] = test['Age'].fillna(impute_value)
現在我們需要指定模型。我增加了一個列IsFemale,作為「Sex」列的編碼:
In [94]: train['IsFemale'] = (train['Sex'] == 'female').astype(int)In [95]: test['IsFemale'] = (test['Sex'] == 'female').astype(int)
然後,我們確定一些模型變量,並創建NumPy數組:
In [96]: predictors = ['Pclass', 'IsFemale', 'Age']In [97]: X_train = train[predictors].valuesIn [98]: X_test = test[predictors].valuesIn [99]: y_train = train['Survived'].valuesIn [100]: X_train[:5]Out[100]: array([[ 3., 0., 22.], [ 1., 1., 38.], [ 3., 1., 26.], [ 1., 1., 35.], [ 3., 0., 35.]])In [101]: y_train[:5]Out[101]: array([0, 1, 1, 1, 0])
我不能保證這是一個好模型,它的特徵都符合。我們用scikit-learn的LogisticRegression模型,創建一個模型實例:
In [102]: from sklearn.linear_model import LogisticRegressionIn [103]: model = LogisticRegression()
與statsmodels類似,我們可以用模型的fit方法,將它擬合到訓練數據:
In [104]: model.fit(X_train, y_train)Out[104]: LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False)
現在,我們可以用model.predict,對測試數據進行預測:
In [105]: y_predict = model.predict(X_test)In [106]: y_predict[:10]Out[106]: array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0])
如果你有測試數據集的真是值,你可以計算準確率或其它錯誤度量值:
(y_true == y_predict).mean()
在實際中,模型訓練經常有許多額外的複雜因素。許多模型有可以調節的參數,有些方法(比如交叉驗證)可以用來進行參數調節,避免對訓練數據過擬合。這通常可以提高預測性或對新數據的健壯性。
交叉驗證通過分割訓練數據來模擬樣本外預測。基於模型的精度得分(比如均方差),可以對模型參數進行網格搜索。有些模型,如logistic回歸,有內置的交叉驗證的估計類。例如,logisticregressioncv類可以用一個參數指定網格搜索對模型的正則化參數C的粒度:
In [107]: from sklearn.linear_model import LogisticRegressionCVIn [108]: model_cv = LogisticRegressionCV(10)In [109]: model_cv.fit(X_train, y_train)Out[109]: LogisticRegressionCV(Cs=10, class_weight=None, cv=None, dual=False, fit_intercept=True, intercept_scaling=1.0, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, refit=True, scoring=None, solver='lbfgs', tol=0.0001, verbose=0)
要手動進行交叉驗證,你可以使用cross_val_score幫助函數,它可以處理數據分割。例如,要交叉驗證我們的帶有四個不重疊訓練數據的模型,可以這樣做:
In [110]: from sklearn.model_selection import cross_val_scoreIn [111]: model = LogisticRegression(C=10)In [112]: scores = cross_val_score(model, X_train, y_train, cv=4)In [113]: scoresOut[113]: array([ 0.7723, 0.8027, 0.7703, 0.7883])
默認的評分指標取決於模型本身,但是可以明確指定一個評分狠話。交叉驗證過的模型需要更長時間來訓練,但會有更高的模型性能。
13.5 繼續學習我只是介紹了一些Python建模庫的表面內容,現在有越來越多的框架用於各種統計和機器學習,它們都是用Python或Python用戶界面實現的。
這本書的重點是數據規整,有其它的書是關注建模和數據科學工具的。其中優秀的有:
Andreas Mueller and Sarah Guido (O』Reilly)的 《Introduction to Machine Learning with Python》
Jake VanderPlas (O』Reilly)的 《Python Data Science Handbook》
Joel Grus (O』Reilly) 的 《Data Science from Scratch: First Principles》
Sebastian Raschka (Packt Publishing) 的《Python Machine Learning》
Aurélien Géron (O』Reilly) 的《Hands-On Machine Learning with Scikit-Learn and TensorFlow》
雖然書是學習的好資源,但是隨著底層開源軟體的發展,書的內容會過時。最好是不斷熟悉各種統計和機器學習框架的文檔,學習最新的功能和API。
讚賞作者
今晚好課推薦,名額有限,下圖掃碼即可免費學
Python愛好者社區歷史文章大合集:
Python愛好者社區歷史文章列表(每周append更新一次)
福利:文末掃碼立刻關注公眾號,「Python愛好者社區」,開始學習Python課程:
關注後在公眾號內回復「課程」即可獲取:
小編的Python入門視頻課程!!!
崔老師爬蟲實戰案例免費學習視頻。
丘老師數據科學入門指導免費學習視頻。
陳老師數據分析報告製作免費學習視頻。
玩轉大數據分析!Spark2.X+Python 精華實戰課程免費學習視頻。
丘老師Python網絡爬蟲實戰免費學習視頻。