数据挖掘:一个end2end完整实例
這里展示一個完整的數據挖掘實例,以供參考。數據挖掘是為了從數據中挖掘出有用的信息,提供決策依據,data driven decision making,而不是people driven或者boss driven。(減少拍腦袋有助于減少脫發,不信看你們公司大佬們都脫成啥樣了)
首先,必須明確需求和目標,要知道自己想干什么和想達到什么。否則不就是瞎搞么,此處又要實名diss吉利了(我為吉利默哀三秒,重拾這個號就是為了黑吉利的,難道是為了傳道授業解惑啊,黑吉利是我創作的動力源泉,感謝源泉最近的所作所為讓我力量爆表)。
在我們的例子中,我們用亞馬遜的一個數據集作為例子,它的目標是為了預測新員工入職時是否需要某項權限。通過模型來預測,協助人工操作。
然后我們開始數據挖掘的步驟。
第一步:收集和準備數據。我們就從kaggle或catboost.dataset上直接下載好了(https://www.kaggle.com/c/amazon-employee-access-challenge),省去這煩心的一步。真實場景中,好的數據比模型和優化還要重要,是關鍵的第一步。為什么工業的數字化轉型這么艱難,主要是數據太差了。
第二步:數據劃分。數據可以劃分成訓練集、驗證集和測試集。訓練數據是用來建立模型的,驗證集是用來驗證結果、調參的,測試數據是用來評估模型的。雖然測試集是用來評估模型的,但是不能根據測試集結果來調整模型和參數,而應該根據驗證集來做。例如我們下載的數據集里有test_data,但必須從train_data繼續劃分,可以留一部分20%驗證,也可以采用交叉驗證的方式。我們這里就用交叉驗證的方法:就像這樣。每次用80%的數據訓練,留20%驗證。5次之后,所有數據都參與了訓練;所有數據也都參與了驗證。
第三步:查看數據。基本的看看我們有多少數據,多少特征,每個特征是什么類型。
(32769, 10) (58921, 10)ACTION RESOURCE MGR_ID ... ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE 0 1 39353 85475 ... 117906 290919 117908 1 1 17183 1540 ... 118536 308574 118539 2 1 36724 14457 ... 267952 19721 117880 3 1 36135 5396 ... 240983 290919 118322 4 1 42680 5905 ... 123932 19793 119325[5 rows x 10 columns]所以能看出來,訓練的數據有32769個樣本,每個樣本有10列,其中ACTION列就是我們想要的預測值,其他9列就是所謂的特征。測試的樣本有58921個,這么多應該是可以充分的評估模型的好壞了。
我們要預測的是action,可以查看一下目標action的分布。目標只包含有0和1兩種變量。目標是0 的有1897,目標是1 的有30872,加在一起就是我們的訓練樣本總數32769。關于這里的0和1的不平衡,后述再講好了。
第四步:關鍵的一步建立完整pipeline。pipeline包括搭建模型所需要的各個部分,從數據導入、數據預處理、特征工程、模型搭建、模型評估等。
一般pipeline開始的模型采用簡單的baseline模型就可以了,這里既然是一個二分類,采用常見的邏輯回歸模型就可以了(同,后續再詳細介紹)。
數據加載部分,包括畫出上面的圖的部分
def load_data(data_dir,plot=False):train = pd.read_csv(data_dir+'/train.csv')test = pd.read_csv(data_dir+'/test.csv')print(train.values.shape,test.values.shape)print(train.head(5))print(np.unique(train.loc[:,['ACTION']]))if plot:dis=train.groupby(['ACTION']).size().reset_index(name='size')plt.bar(dis['ACTION'].astype('int'),dis['size'],color='lightblue')for a, b in zip(dis['ACTION'], dis['size']):plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)plt.text(a, b/3, '%.0f'%a, ha='center',va='bottom',fontsize=15,color='blue')plt.show()return train,test特征轉換部分,這里的特征全都是類別特征。轉化為one-hot特征,one-hot是這樣的。雖然表面上他們是0,1,2,3來表示,其實可能代表的是質量、研發、產品、售后四個部門,他們之間并沒有0到1到2,這樣的數字遞進關系,就每一個轉化為一個維度好了。
def transform_feature(data,feature_cols,target_cols=None,training=False):if training:assert target_cols is not Noneoh = OneHotEncoder(sparse=True, dtype=np.float32, handle_unknown='ignore')x=oh.fit_transform(data.loc[:,feature_cols])with open("encoder", "wb") as f:pickle.dump(oh, f)y=data[target_cols].valuesprint(x.shape,y.shape)return x,ywith open('encoder','rb') as f:oh = pickle.load(f)x=oh.transform(data.loc[:,feature_cols])return x生成模型部分,這里采用最簡單的線性模型,邏輯回歸。
seed=2020def create_model():model = LogisticRegression(penalty='l2',C=1.0,fit_intercept=True,random_state=seed,solver='liblinear',max_iter=1000,)return model交叉驗證模型評估部分,這就是上面圖里,分成5份,每份分別來驗證。
def validate_model(x,y,model,metrics):skf = StratifiedKFold(n_splits=5, random_state=seed, shuffle=True)re=[]for train_index, test_index in skf.split(x, y):print("TRAIN:", len(train_index), "TEST:", len(test_index))x_train, x_test = x[train_index], x[test_index]y_train, y_test = y[train_index], y[test_index]model.fit(x_train,y_train)y_pred=model.predict_proba(x_test)[:,1]re.append(metrics(y_test,y_pred))print(re)生成測試結果部分,最后把測試集預測處理,評估以下模型。
def predict(model,x_test):predictions = model.predict_proba(x_test)[:, 1]print(predictions)return predictions把上述各個部分串聯起來的主函數部分
def main():train,test=load_data(data_dir='../data/amazon-employee-access-challenge')feature_cols=[i for i in train.columns if i not in ['ACTION','ROLE_TITLE']]target_cols='ACTION'x,y=transform_feature(train,feature_cols=feature_cols,target_cols=target_cols,training=True)model=create_model()result=validate_model(x,y,model,metrics=roc_auc_score)x_test = transform_feature(test, feature_cols=feature_cols,target_cols=None,training = False)predict(model,x_test)if __name__=='__main__':main()第五步:根據驗證結果持續優化,來取得最終模型和參數。這里,優化暫不展開來講,下一篇數據挖掘II中會詳細介紹如何進一步的優化。I肯定要寫的,優化才是我日常主要工作、但是卻不擅長的部分。為了保住自己的工作,不去吉利這樣的公司,一定會慢慢寫起來的。
第六步:在測試集上評估結果,如果結果也是滿意的,則準備分析報告或上線。二分類最常用的評估措施,可以查看準確率、召回率、F1、AUC等。他們都基于以下矩陣:
即使是簡單的邏輯回歸模型,5次取不同數據也可以達到 [0.863, 0.856, 0.861, 0.867, 0.85],也就是我們評估這個模型可以達到85%~86%的準確率。這已經是可以接受的結果了。在二分類,即使是瞎蒙,最少也會有50%的概率。為什么說最少呢,二者在平衡的時候,瞎蒙的概率是最低的。如果像實例中1的個數遠遠大于0的個數,全部都蒙1也會有百分之七八十的準確率。所以才會有上述的不同度量方法來解決這個問題。
以上,差不多就是一個完整的數據挖掘過程。參考以下鏈接
- https://www.kaggle.com/dmitrylarko/kaggledays-sf-1-amazon-baseline
最后,日常apprecriate黑吉利(black geely)的邀請,故有此文。But,我只是順手黑一黑,毫無惡意的。I’m still nice, and black geely is my friend。我是YueTan,完整代碼在知識星球分享和github
歡迎關注我的公眾號:YueTan
總結
以上是生活随笔為你收集整理的数据挖掘:一个end2end完整实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springmvc接收json数据的4种
- 下一篇: Bugzilla 使用指南