轉載自:https://baijia.baidu.com/s?old_id=307995
最近,我從孫子(指《孫子兵法》——譯者注)那里學到了一些策略:速度和准備
“兵之情主速,乘人之不及,由不虞之道,攻其所不戒也。”(《孫子兵法•九地篇》)無備為戰之大患,有備無患,其乃至德也。(哈哈,譯者自己寫了這句,想必大家能明白。)
這與數據科學博客有什么關系呢?這是你贏得競爭和編程馬拉松的關鍵。如果你比競爭對手准備得更充分,你學習、迭代執行的速度越快,那么你就取得更好的名次,帶來更好的結果。
由於近幾年來,Python用戶數量上漲及其本身的簡潔性,使得這個工具包對數據科學世界的Python專家們變得有意義。本文將幫助你更快更好地建立第一個預測模型。絕大多數優秀的數據科學家和kagglers建立自己的第一個有效模型並快速提交。這不僅僅有助於他們領先於排行榜,而且提供了問題的基准解決方案。
預測模型的分解過程
我總是集中於投入有質量的時間在建模的初始階段,比如,假設生成、頭腦風暴、討論或理解可能的結果范圍。所有這些活動都有助於我解決問題,並最終讓我設計出更強大的商業解決方案。為什么你要在前面花費這段時間,這有充分的理由:
你有足夠的時間投入並且你是無經驗的(這是有影響的)
你不帶有其它數據觀點或想法的偏見(我總是建議,在深入研究數據之前做假設生成)
在后面的階段,你會急於完成該項目而沒有能力投入有質量的時間了。
這個階段需要投入高質量時間,因此我沒有提及時間表,不過我建議你把它作為標准的做法。這有助於你建立建立更好地預測模型,在后面的階段的只需較少的迭代工作。讓我們來看看建立第一個模型的剩余階段的時間表:
數據描述性分析——50%的時間
數據預處理(缺失值和異常值修復)——40%的時間
數據建模——4%的時間
性能預測——6%的時間
讓我們一步一步完成每個過程(每一步投入預測的時間):
階段1:描述性分析/數據探索
在我剛開始成為數據科學家的時候,數據探索占據了我大量的時間。不過,隨着時間的推移,我已經把大量的數據操作自動化了。由於數據准備占據建立第一個模型工作量的50%,自動化的好處是顯而易見的。
這是我們的第一個基准模型,我們去掉任何特征設計。因此,描述分析所需的時間僅限於了解缺失值和直接可見的大的特征。在我的方法體系中,你將需要2分鍾來完成這一步(假設,100000個觀測數據集)。
我的第一個模型執行的操作:
確定ID,輸入特征和目標特征
確定分類和數值特征
識別缺失值所在列
階段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:導入所需的庫,讀取測試和訓練數據集。
#導入pandas、numpy包,導入LabelEncoder、random、RandomForestClassifier、GradientBoostingClassifier函數
import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder import random from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import 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()#返回True或False,True意味着有缺失值而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'])
現在可以提交了!