第十一節(jié) Python建模庫

本章節(jié)以及后續(xù)章節(jié)的源碼,當然也可以從我的github下載,在源碼中我自己加了一些中文注釋。

一、pandas與模型代碼的接口

模型開發(fā)的通常工作流是使用pandas進行數(shù)據加載和清洗,然后切換到建模庫進行建模。開發(fā)模型的重要一環(huán)是機器學習中的“特征工程”。它可以描述從原始數(shù)據集中提取信息的任何數(shù)據轉換或分析,這些數(shù)據集可能在建模中有用。前面學習的數(shù)據聚合和GroupBy工具常用于特征工程中。

pandas與其它分析庫通常是靠NumPy的數(shù)組聯(lián)系起來的。將DataFrame轉換為NumPy數(shù)組,可以使用.values屬性:

要轉換回DataFrame,可以傳遞一個二維ndarray,可帶有列名:

最好當數(shù)據是均勻的時候使用.values屬性。例如,全是數(shù)值類型。如果數(shù)據是不均勻的,結果會是Python對象的ndarray:

對于一些模型,你可能只想使用列的子集。使用loc,用values作索引:

一些庫原生支持pandas,會自動完成工作:從DataFrame轉換到NumPy,將模型的參數(shù)名添加到輸出表的列或Series。其它情況,你可以手工進行“元數(shù)據管理”。

我們學習了pandas的Categorical類型和pandas.get_dummies函數(shù)。

pandas.get_dummies函數(shù)用法:

假設數(shù)據集中有一個非數(shù)值列:

如果我們想替換category列為虛變量,我們可以創(chuàng)建虛變量,刪除category列,然后添加到結果:

用虛變量擬合某些統(tǒng)計模型會有一些細微差別。當你不只有數(shù)字列時,使用Patsy可能更簡單,更不容易出錯。

二、用Patsy創(chuàng)建模型描述

Patsy是Python的一個庫,使用簡短的字符串“公式語法”描述統(tǒng)計模型(尤其是線性模型)。Patsy適合描述statsmodels的線性模型。Patsy的公式是一個特殊的字符串語法,如下所示:

a+b不是將a與b相加的意思,而是為模型創(chuàng)建的設計矩陣。patsy.dmatrices函數(shù)接收一個公式字符串和一個數(shù)據集(可以是DataFrame或數(shù)組的字典),為線性模型創(chuàng)建設計矩陣:

這些Patsy的DesignMatrix實例是NumPy的ndarray,帶有附加元數(shù)據:

你可能想Intercept是哪里來的。這是線性模型(比如普通最小二乘回歸)的慣例用法。添加 +0 到模型可以不顯示intercept(截距):

Patsy對象可以直接傳遞到算法(比如numpy.linalg.lstsq)中,它執(zhí)行普通最小二乘回歸:

模型的元數(shù)據保留在design_info屬性中,因此你可以重新附加列名到擬合系數(shù),以獲得一個Series,例如:

squeeze 函數(shù):從數(shù)組的形狀中刪除單維度條目,即把shape中為1的維度去掉。

用法:numpy.squeeze(a,axis = None)

1、用Patsy公式進行數(shù)據轉換

你可以將Python代碼與patsy公式結合。在評估公式時,庫將嘗試查找在封閉作用域內使用的函數(shù):

常見的變量轉換包括標準化(平均值為0,方差為1)和中心化(減去平均值)。Patsy有內置的函數(shù)進行這樣的工作:

作為建模的一步,你可能擬合模型到一個數(shù)據集,然后用另一個數(shù)據集評估模型。另一個數(shù)據集可能是剩余的部分或是新數(shù)據。當執(zhí)行中心化和標準化轉變,用新數(shù)據進行預測要格外小心。因為你必須使用平均值或標準差轉換新數(shù)據集,這也稱作狀態(tài)轉換。

patsy.build_design_matrices函數(shù)可以使用原始樣本數(shù)據集的保存信息,來轉換新數(shù)據:

因為Patsy中的加號不是加法的意義,當你按照名稱將數(shù)據集的列相加時,你必須用特殊I函數(shù)將它們封裝起來:

Patsy的patsy.builtins模塊還有一些其它的內置轉換。

2、分類數(shù)據和Patsy

非數(shù)值數(shù)據可以用多種方式轉換為模型設計矩陣。

當你在Patsy公式中使用非數(shù)值數(shù)據,它們會默認轉換為虛變量。如果有截距,會去掉一個,避免共線性:

如果你從模型中忽略截距,每個分類值的列都會包括在設計矩陣的模型中:

使用C函數(shù),數(shù)值列可以截取為分類量:

當你在模型中使用多個分類名,事情就會變復雜,因為會包括key1:key2形式的相交部分,它可以用在方差(ANOVA)模型分析中:

Patsy提供轉換分類數(shù)據的其它方法,包括以特定順序轉換。

三、statsmodels介紹

statsmodels是Python進行擬合多種統(tǒng)計模型、進行統(tǒng)計試驗和數(shù)據探索可視化的庫。Statsmodels包含許多經典的統(tǒng)計方法,但沒有貝葉斯方法和機器學習模型。

statsmodels包含的模型有:

(1)線性模型,廣義線性模型和健壯線性模型

(2)線性混合效應模型

(3)方差(ANOVA)方法分析

(4)時間序列過程和狀態(tài)空間模型

(5)廣義矩估計

估計線型模型

statsmodels有多種線性回歸模型,包括從基本(比如普通最小二乘)到復雜(比如迭代加權最小二乘法)的。

statsmodels的線性模型有兩種不同的接口:基于數(shù)組和基于公式。它們可以通過API模塊引入:

我們從一些隨機數(shù)據生成一個線性模型:

線性模型通常要擬合一個截距。sm.add_constant函數(shù)可以添加一個截距的列到現(xiàn)存的矩陣:

sm.OLS類可以擬合一個普通最小二乘回歸,這個模型的fit方法返回了一個回歸結果對象,它包含估計的模型參數(shù)和其它內容:

對結果使用summary方法可以打印模型的詳細診斷結果:

假設所有的模型參數(shù)都在一個DataFrame中:

現(xiàn)在,我們使用statsmodels的公式API和Patsy的公式字符串:

觀察下statsmodels是如何返回Series結果的,附帶有DataFrame的列名。當使用公式和pandas對象時,我們不需要使用add_constant。

給出一個樣本外數(shù)據,你可以根據估計的模型參數(shù)計算預測值:

statsmodels的線性模型結果還有其它的分析、診斷和可視化工具。除了普通最小二乘模型,還有其它的線性模型。

四、scikit-learn介紹

????????scikit-learn是一個廣泛使用、用途多樣的Python機器學習庫。它包含多種標準監(jiān)督和非監(jiān)督機器學習方法和模型選擇和評估、數(shù)據轉換、數(shù)據加載和模型持久化工具。這些模型可以用于分類、聚合、預測和其它任務。

????????舉個例子,用一個Kaggle競賽的經典數(shù)據集,關于泰坦尼克號乘客的生還率。我們用pandas加載測試和訓練數(shù)據集:

statsmodels和scikit-learn通常不能接收缺失數(shù)據,因此我們要查看列是否包含缺失值:

在統(tǒng)計和機器學習的例子中,根據數(shù)據中的特征,一個典型的任務是預測乘客能否生還。模型現(xiàn)在訓練數(shù)據集中擬合,然后用樣本外測試數(shù)據集評估。

用年齡作為預測值,但是它包含缺失值。缺失數(shù)據補全的方法有多種,我用的是一種簡單方法,用訓練數(shù)據集的中位數(shù)補全兩個表的空值:

現(xiàn)在我們需要指定模型。我增加了一個列IsFemale,作為“Sex”列的編碼:

然后,我們確定一些模型變量,并創(chuàng)建NumPy數(shù)組:

不能保證這是一個好模型,但它的特征都符合。我們用scikit-learn的LogisticRegression模型,創(chuàng)建一個模型實例。與statsmodels類似,我們可以用模型的fit方法,將它擬合到訓練數(shù)據:

現(xiàn)在,我們可以用model.predict,對測試數(shù)據進行預測:

如果有測試數(shù)據集的真是值,可以計算準確率或其它錯誤度量值:

在實際中,模型訓練經常有許多額外的復雜因素。許多模型有可以調節(jié)的參數(shù),有些方法(比如交叉驗證)可以用來進行參數(shù)調節(jié),避免對訓練數(shù)據過擬合。這通??梢蕴岣哳A測性或對新數(shù)據的健壯性。

交叉驗證通過分割訓練數(shù)據來模擬樣本外預測。基于模型的精度得分(比如均方差),可以對模型參數(shù)進行網格搜索。有些模型,如logistic回歸,有內置的交叉驗證的估計類。例如,logisticregressionCV類可以用一個參數(shù)指定網格搜索對模型的正則化參數(shù)C的粒度:

要手動進行交叉驗證,你可以使用cross_val_score幫助函數(shù),它可以處理數(shù)據分割。例如,要交叉驗證我們的帶有四個不重疊訓練數(shù)據的模型,可以這樣做:

默認的評分指標取決于模型本身,但是可以明確指定一個評分。交叉驗證過的模型需要更長時間來訓練,但會有更高的模型性能。

快速學習:

第一節(jié) NumPy基礎(一)

第二節(jié) NumPy基礎(二)

第三節(jié) Pandas入門基礎

第四節(jié) 數(shù)據加載、存儲

第五節(jié) 數(shù)據清洗

第六節(jié) 數(shù)據合并、重塑

第七節(jié) 數(shù)據聚合與分組運算

第八節(jié) 數(shù)據可視化

第九節(jié) pandas高級應用

第十節(jié) 時間序列

第十一節(jié) Python建模庫

數(shù)據分析案例--1880-2010年間全美嬰兒姓名的處理

數(shù)據分析案例--MovieLens 1M數(shù)據集

數(shù)據分析案例--USA.gov數(shù)據

數(shù)據分析案例--2012聯(lián)邦選舉委員會數(shù)據庫

數(shù)據分析案例--USDA食品數(shù)據庫

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容