如何用Python在10分鐘內建立一個預測模型

關於轉載授權

大數據文摘作品,歡迎個人轉PO朋友圈,自媒體、媒體、機構轉載務必申請授權,後台留言「機構名稱+文章標題+轉載」,申請過授權的不必再次申請,只要按約定轉載即可,但文末需放置大數據文摘二維碼。

編譯:席雄芬
校對:黃念

引言

最近,我從孫子(指《孫子兵法》——譯者註)那裡學到了一些策略:速度和準備

速度與準備

「兵之情主速,乘人之不及,由不虞之道,攻其所不戒也。」(《孫子兵法•九地篇》)無備為戰之大患,有備無患,其乃至德也。(哈哈,譯者自己寫了這句,想必大家能明白。)

這與數據科學博客有什麼關係呢?這是你贏得競爭和編程馬拉松的關鍵。如果你比競爭對手準備得更充分,你學習、迭代執行的速度越快,那麼你就取得更好的名次,帶來更好的結果。

由於近幾年來,Python用戶數量上漲及其本身的簡潔性,使得這個工具包對數據科學世界的Python專家們變得有意義。本文將幫助你更快更好地建立第一個預測模型。絕大多數優秀的數據科學家和kagglers建立自己的第一個有效模型並快速提交。這不僅僅有助於他們領先於排行榜,而且提供了問題的基準解決方案。

預測模型的分解過程

我總是集中於投入有質量的時間在建模的初始階段,比如,假設生成、頭腦風暴、討論或理解可能的結果範圍。所有這些活動都有助於我解決問題,並最終讓我設計出更強大的商業解決方案。為什麼你要在前面花費這段時間,這有充分的理由:

  1. 你有足夠的時間投入並且你是無經驗的(這是有影響的)

  2. 你不帶有其它數據觀點或想法的偏見(我總是建議,在深入研究數據之前做假設生成)

  3. 在後面的階段,你會急於完成該項目而沒有能力投入有質量的時間了。

這個階段需要投入高質量時間,因此我沒有提及時間表,不過我建議你把它作為標準的做法。這有助於你建立建立更好地預測模型,在後面的階段的只需較少的迭代工作。讓我們來看看建立第一個模型的剩餘階段的時間表:

  1. 數據描述性分析——50%的時間

  2. 數據預處理(缺失值和異常值修復)——40%的時間

  3. 數據建模——4%的時間

  4. 性能預測——6%的時間

讓我們一步一步完成每個過程(每一步投入預測的時間):

階段1:描述性分析/數據探索

在我剛開始成為數據科學家的時候,數據探索占據了我大量的時間。不過,隨著時間的推移,我已經把大量的數據操作自動化了。由於數據準備占據建立第一個模型工作量的50%,自動化的好處是顯而易見的。

這是我們的第一個基準模型,我們去掉任何特徵設計。因此,描述分析所需的時間僅限於了解缺失值和直接可見的大的特徵。在我的方法體系中,你將需要2分鐘來完成這一步(假設,100000個觀測數據集)。

我的第一個模型執行的操作:

  1. 確定ID,輸入特徵和目標特徵

  2. 確定分類和數值特徵

  3. 識別缺失值所在列

階段2:數據預處理(缺失值處理)

有許多方法可以解決這個問題。對於我們的第一個模型,我們將專注於智能和快速技術來建立第一個有效模型。

  • 為缺失值創建假標誌:有用,有時缺失值本身就攜帶了大量的信息。

  • 用均值、中位數或其它簡單方法填補缺失值:均值和中位數填補都表現良好,大多數人喜歡用均值填補但是在有偏分布的情況下我建議使用中位數。其它智能的方法與均值和中位數填補類似,使用其它相關特徵填補或建立模型。比如,在Titanic生存挑戰中,你可以使用乘客名字的稱呼,比如:「Mr.」, 「Miss.」,」Mrs.」,」Master」,來填補年齡的缺失值,這對模型性能有很好的影響。

  • 填補缺失的分類變量:創建一個新的等級來填補分類變量,讓所有的缺失值編碼為一個單一值比如,「New_Cat」,或者,你可以看看頻率組合,使用高頻率的分類變量來填補缺失值。

由於數據處理方法如此簡單,你可以只需要3到4分鐘來處理數據。

階段3:數據建模

根據不同的業務問題,我推薦使用GBM或RandomForest技術的任意一種。這兩個技術可以極其有效地創建基準解決方案。我已經看到數據科學家通常把這兩個方法作為他們的第一個模型同時也作為最後一個模型。這最多用去4到5分鐘。

階段4:性能預測

有各種各樣的方法可以驗證你的模型性能,我建議你將訓練數據集劃分為訓練集和驗證集(理想的比例是70:30)並且在70%的訓練數據集上建模。現在,使用30%的驗證數據集進行交叉驗證並使用評價指標進行性能評估。最後需要1到2分鐘執行和記錄結果。

本文的目的不是贏得比賽,而是建立我們自己的基準。讓我們用python代碼來執行上面的步驟,建立你的第一個有較高影響的模型。

讓我們開始付諸行動
首先我假設你已經做了所有的假設生成並且你擅長使用python的基本數據科學操作。我用一個數據科學挑戰的例子來說明。讓我們看一下結構:

步驟1:導入所需的庫,讀取測試和訓練數據集。

#導入pandasnumpy包,導入LabelEncoderrandomRandomForestClassifierGradientBoostingClassifier函數
import pandas as pd
import numpy as np
fromsklearn.preprocessing import LabelEncoder
import random
fromsklearn.ensemble import RandomForestClassifier
from sklearn.ensembleimport GradientBoostingClassifier
#讀取訓練、測試數據集
train=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Train.csv')
test=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Test.csv')
#創建訓練、測試數據集標誌
train['Type']='Train'
test['Type']='Test'
fullData =pd.concat([train,test],axis=0) #聯合訓練、測試數據集

步驟2:該框架的第二步並不需要用到python,繼續下一步。

步驟3:查看數據集的列名或概要

fullData.columns # 顯示所有的列名稱
fullData.head(10) #顯示數據框的前10條記錄
fullData.describe() #你可以使用describe()函數查看數值域的概要

步驟4:確定a)ID變量 b)目標變量 c)分類變量 d)數值變量 e)其他變量。

ID_col = ['REF_NO']
target_col = ["Account.Status"]
cat_cols = ['children','age_band','status','occupation','occupation_partner','home_status','family_income','self_employed', 'self_employed_partner','year_last_moved','TVarea','post_code','post_area','gender','region']
num_cols= list(set(list(fullData.columns))-set(cat_cols)-set(ID_col)-set(target_col)-set(data_col))
other_col=['Type'] #為訓練、測試數據集設置標識符

步驟5:識別缺失值變量並創建標誌

fullData.isnull().any()#返回TrueFalseTrue意味著有缺失值而False相反
num_cat_cols = num_cols+cat_cols # 組合數值變量和分類變量
#為有缺失值的變量創建一個新的變量
# 對缺失值標誌為1,否則為0
 
for var in num_cat_cols:
    if fullData[var].isnull().any()==True:
        fullData[var+'_NA']=fullData[var].isnull()*1 

步驟6:填補缺失值

#用均值填補數值缺失值
fullData[num_cols] = fullData[num_cols].fillna(fullData[num_cols].mean(),inplace=True)
#-9999填補分類變量缺失值
fullData[cat_cols] = fullData[cat_cols].fillna(value = -9999)

步驟7:創建分類變量的標籤編碼器,將數據集分割成訓練和測試集,進一步,將訓練數據集分割成訓練集和測試集。

#創建分類特徵的標籤編碼器
for var in cat_cols:
 number = LabelEncoder()
 fullData[var] = number.fit_transform(fullData[var].astype('str'))
 
#目標變量也是分類變量,所以也用標籤編碼器轉換
fullData["Account.Status"] = number.fit_transform(fullData["Account.Status"].astype('str'))
 
train=fullData[fullData['Type']=='Train']
test=fullData[fullData['Type']=='Test']
train['is_train'] = np.random.uniform(0, 1, len(train)) <= .75
Train, Validate = train[train['is_train']==True], train[train['is_train']==False]

步驟8:將填補和虛假(缺失值標誌)變量傳遞到模型中,我使用隨機森林來預測類。

features=list(set(list(fullData.columns))-set(ID_col)-set(target_col)-set(other_col))
x_train = Train[list(features)].values
y_train = Train["Account.Status"].values
x_validate = Validate[list(features)].values
y_validate = Validate["Account.Status"].values
x_test=test[list(features)].values
random.seed(100)
rf = RandomForestClassifier(n_estimators=1000)
rf.fit(x_train, y_train)
 

步驟9:檢查性能做出預測

status = rf.predict_proba(x_validate)
fpr, tpr, _ = roc_curve(y_validate, status[:,1])
roc_auc = auc(fpr, tpr)
print roc_auc
final_status = rf.predict_proba(x_test)
test["Account.Status"]=final_status[:,1]
test.to_csv('C:/Users/Analytics Vidhya/Desktop/model_output.csv',columns=['REF_NO','Account.Status'])

現在可以提交了!

【志願者招募-可視化專欄】

欄目介紹:可視化專欄從2016年起打算分為兩塊。一塊以翻譯為主,把網上關於可視化的好文章推薦給讀者。另一塊以編程為主,從手把手系列文章起步,把可視化工具的使用方法介紹給讀者。以後會考慮做些可視化相關的小項目。

加入要求:有志願者工作熱情、學習熱情。基本保證每周3小時的志願者服務時間。英語讀寫能力至少達到六級水平。如果從事以編程為主的志願者工作,要求會Python或R語言,或者有其它語言基礎,願意學習可視化相關編程知識。在大數據文摘後台回復「志願者」可了解更多。

欄目主編:姚佳靈,擁有計算機軟體學士和工商管理碩士學位。

往期精彩文章推薦,點擊圖片可閱讀

  • 動圖,用Python追蹤NBA球員的運動軌跡


  • 用Python進行數據可視化的10種方法

【限時乾貨下載】

點擊下圖,閱讀「2016大數據發展7大趨勢」

2016/1/31前
2015年12月乾貨文件打包下載,請點擊大數據文摘底部菜單:下載等–12月下載


大數據文摘精彩文章:
回復【金融】 看【金融與商業】專欄歷史期刊文章
回復【可視化】感受技術與藝術的完美結合
回復【安全】 關於泄密、黑客、攻防的新鮮案例
回復【算法】 既漲知識又有趣的人和事
回復【Google】 看其在大數據領域的舉措
回復【院士】 看眾多院士如何講大數據
回復【隱私】 看看在大數據時代還有多少隱私
回復【醫療】 查看醫療領域文章6篇
回復【徵信】 大數據徵信專題四篇
回復【大國】 「大數據國家檔案」之美國等12國
回復【體育】 大數據在網球、NBA等應用案例
回復【志願者】了解如何加入大數據文摘
長按指紋,即可關注「大數據文摘」

專注大數據,每日有分享

閱讀原文


關於作者:
數據使金融、互聯網、IT發生巨變又顛覆著醫療、農業、餐飲、房地產、交通、教育、製造乃至人類本身。旨在普及數據思維,傳播數據文化,我們為您精選各行業大數據相關案例、資訊,幫您緊跟科技前沿,手握數據思維、數據分析、數據挖掘、數據可視化等重磅乾貨

微信號:BigDataDigest