零基礎數據挖掘入門系列(一) - 賽題理解

思維導圖:零基礎入門數據挖掘的學習路徑

1. 寫在前面

零基礎入門數據挖掘系列是記錄自己在Datawhale舉辦的數據挖掘專題學習中的所學和所想, 該系列筆記使用理論結合實踐的方式,整理數據挖掘相關知識,提升在實際場景中的數據分析、數據清洗,特徵工程、建模調參和模型融合等技能。所以這個系列筆記共五篇重點內容,也分別從上面五方面進行整理學習,既是希望能對知識從實戰的角度串聯回憶,加強動手能力的鍛鍊,也希望這五篇筆記能夠幫助到更多喜歡數據挖掘的小夥伴,我們一起學習,一起交流吧。

既然是理論結合實踐的方式,那麼我們是從天池的一個二手車交易價格預測比賽出發進行學習,既可以學習到知識,又可以學習如何入門一個數據競賽, 下面我們開始吧。

今天是本系列的第一篇賽題理解,這一個算是熱身,作爲切入一道賽題的基礎,賽題理解是極其重要的,對於賽題的理解甚至會影響後續的特徵工程構建以及模型的選擇,最主要是會影響後續發展工作的方向,比如挖掘特徵的方向或者存在問題解決問題的方向,正確瞭解賽題背後的思想以及賽題業務邏輯的清晰,也很有利於花費更少時間構建更爲有效的特徵模型。 今天我們就從賽題的理解出發, 首先了解一下這次賽題的概況和數據,從中分析賽題以及大致的處理方式, 其次我們瞭解一些模型評測的指標,最後對賽題的理解整理一些經驗(來自Datawhale團隊的零基礎入門數據挖掘)

大綱如下:

  • 賽題的瞭解(這裏面會涉及賽題概況和分析)
  • 模型的預測指標
  • 數據讀取和指標評價的代碼實戰
  • 總結tricks

Ok, let’s go!

2. 賽題的分析

2.1 賽題概況

這次比賽是天池和Datawhale聯手舉辦的一個數據挖掘的入門競賽,是要求根據給定的二手車的數據集,來預測二手車的交易價格。

該數據來自某交易平臺的二手車交易記錄,總數據量超過40w,包含31列變量信息,其中15列爲匿名變量。爲了保證比賽的公平性,將會從中抽取15萬條作爲訓練集,5萬條作爲測試集A,5萬條作爲測試集B,同時會對name、model、brand和regionCode等信息進行脫敏。

2.2 數據概況

這次的數據集是二手車的交易記錄, 官方提供三個文件供下載:

  • used_car_train_20200301.csv: 這是訓練集部分, 150000條交易記錄, 31列,其中30列是變量信息,1一列價格信息。
  • used_car_testA_20200301.csv: 這是測試集A部分, 裏面是50000個測試樣本,依舊是30列特徵信息,沒有價格列(這個我們需要建立模型自己預測)
  • user_car_sample_submit.csv:這一個是看一下最後結果的提交格式

下面看一下訓練集和測試集的30個字段的含義:
在這裏插入圖片描述
其中後面的V系列特徵是根據汽車的評論和標籤等大量信息得到的embedding向量,不知道具體含義了。

初步看這個表,可以大體上了解一下每一列到底是什麼樣的數據格式,代表着什麼信息,這樣的好處是後續處理的時候能夠大體上知道哪些字段可能對價格的預測沒有作用(比如ID, name等), 這樣我們後面就可以刪掉這些字段; 也看看每一個字段的類型,比如上面的字段中有些數值型的,像發動機功率, 汽車行駛公里等, 還有些類別型的,像車身類型, 燃油類型,變速箱這些字段, 我們也得大體看一下,做到心中有數,這樣的好處是後續處理的時候至少把數值型的和類別型的數據分開進行處理, 類別型的該獨熱的獨熱,並且缺失值處理的時候,特徵工程的時候,數值型和類別型的字段處理方式是不一樣的,所以在這裏就可以先留點心

所以通過初步看這個表可以給我們的信息就是有30個字段, 15個匿名的,我們不知道具體含義,先可以不管, 15個知道含義的,我們得重點處理分析,這裏面我們可以排除一些對價格預測無作用的字段,還得數值型和類別型的字段分開處理。

2.3 賽題分析

有了前面的兩步,就可以稍微的分析一下這個任務了,我們的目標就是根據給的訓練集的數據,建立一個模型,然後去預測測試集裏面的每個樣本的價格。

因爲預測的價格是連續型的數據,所以這是一個典型的迴歸任務,知道是迴歸任務之後,我們就基本上能夠確定出用於迴歸預測的模型(Regressor系列),然後也能確定出評價指標(迴歸任務的評價指標)

這樣,基本上根據這個賽題,我們大體上就可以梳理出一個簡單的處理框架:

  1. 數據集導入,然後進行初步探索
  2. 數據挖掘的過程
  3. 建立迴歸模型的過程
  4. 使用迴歸模型的評價指標對模型評價,選出好的模型
  5. 預測結果的過程

有了這個框架,每一步大體做什麼就有數了。

3. 評價指標

賽題給出的評價指標是MAE(Mean Absolute Error)
在這裏插入圖片描述
MAE越小, 說明模型預測的越準確。

這裏賽題既然給出了評價指標,我們肯定是用這個來評價模型了, 當然這裏整理一下其他的用於分類或者回歸的評價指標:

  • 迴歸預測類模型的評估指標: 平均絕對誤差(Mean Absolute Error, MAE)、均方誤差(Mean Squared Error, MSE), 平均絕對百分誤差(Mean Absolute Percentage Error, MAPE), 均方根誤差(Root Mean Squared Error), R2(R-Square),這些具體怎麼算車哥在零基礎入門數據挖掘中總結的很清楚,Datawhale 零基礎入門數據挖掘-Task1 賽題理解

    這些指標,sklearn庫中都已經集成,想用的話直接掉包即可:

    from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
    
  • 分類算法常見的評估指標:accuracy score, 精準率,召回率, F1值, ROC-AUC曲線等,混淆矩陣等,這個我之前整理過算法模型評估之混淆矩陣,accuracy,查準率,查全率,AUC(ROC)等小總結

    同樣,sklearn中已經集成,直接調用即可。

    from sklearn.metrics import accuracy_scorec, precision_score, recall_score, f1_score, auc, confusion_matrix
    

4. 數據讀取和指標評價的代碼實戰

4.1 數據讀取pandas

import pandas as pd 
import numpy as np
path = './data/' 
## 1) 載入訓練集和測試集; 
Train_data = pd.read_csv(path+'train.csv', sep=' ')   # 間隔符這次讀的時候不要忘,否則讀取錯誤
Test_data = pd.read_csv(path+'testA.csv', sep=' ') 
print('Train data shape:',Train_data.shape) 
print('TestA data shape:',Test_data.shape)

4.2 分類指標評價計算示例

import numpy as np

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix

y_pred = [0, 1, 0, 1] 
y_true = [0, 1, 1, 1] 

print('ACC:',accuracy_score(y_true, y_pred))
print('Precision',precision_score(y_true, y_pred)) 
print('Recall',recall_score(y_true, y_pred)) 
print('F1-score:',f1_score(y_true, y_pred))
print('confusion_matrix: ', confusion_matrix(y_true, y_pred)

# AUC
y_true = np.array([0, 0, 1, 1]) 
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))

4.3 迴歸指標評價計算示例

import numpy as np 
from sklearn import metrics

# MAPE需要自己實現 
def mape(y_true, y_pred): 
	return np.mean(np.abs((y_pred - y_true) / y_true))
	
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0]) 
y_pred = np.array([1.0, 4.5, 3.8, 3.2, 3.0, 4.8, -2.2])
# MSE 
print('MSE:',metrics.mean_squared_error(y_true, y_pred)) 
# RMSE 
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred))) 
# MAE 
print('MAE:',metrics.mean_absolute_error(y_true, y_pred)) 
# MAPE 
print('MAPE:',mape(y_true, y_pred))


## R2-score 
y_true = [3, -0.5, 2, 7] 
y_pred = [2.5, 0.0, 2, 8] 
print('R2-score:',metrics.r2_score(y_true, y_pred))

5. 總結

這次算是零基礎數據挖掘入門系列的熱身,主要是進行了二手車價格預測的賽題分析和數據集的瞭解,然後是評價指標的簡要介紹,最後是一個小的代碼實操。

今天的學習比較簡單,下面整理一下關於賽題理解的一些經驗(來自Datawhale的零基礎入門數據挖掘的團隊整理):

  • 賽題理解究竟是在理解什麼?

    理解賽題是從直觀上對問題進行梳理, 分析問題的目標,到底要讓做什麼事情

    分析問題的可行度,從賽題背景引發的賽題任務出發理解任務邏輯, 探索對賽題任務有意義的外在數據

    對賽題數據有一個初步瞭解,知道和任務相關的數據字段和數據字段的類型, 數據之間的內在關聯等。這樣有利於後面的處理

    對於不同的問題,在處理方式上的差異是很大的。如果用簡短的話來說,並且在比賽的角度或者做工程的角度,就是該賽題符合的問題是什麼問題,大概要去用哪些指標,哪些指標是否會做到線上線下的一致性,是否有效的利於我們進一步的探索更高線上分數的線下驗證方法,在業務上,你是否對很多原始特徵有 很深刻的瞭解,並且可以通過EDA來尋求他們直接的關係,最後構造出滿意的特徵。

  • 有了賽題理解之後,我們該做什麼?

    在對於賽題有了一定的瞭解後,分析清楚了問題的類型性質和對於數據理解 的這一基礎上,是不是賽題理解就做完了呢? 並不是的

    我們至少要有一些相應的理解分析,比如這題的難點可能在哪裏,關鍵點可能在哪裏,哪些地方可以挖掘更好的特徵.

    用什麼樣得線下驗證方式更爲穩定,出現了過擬合或者其他問題,估摸可以用什麼方法去解決這些問題

    哪些數據是可靠的,哪些數據是需要精密的處理的,哪部分數據應該是關鍵數據(背景的業務邏輯下,比如CTR的題,一個 尋常顧客大體會有怎麼樣的購買行爲邏輯規律,或者風電那種題,如果機組比較鄰近,相關一些風速,轉速 特徵是否會很近似)

    這時是在一個宏觀的大體下分析的,有助於摸清整個題的思路脈絡,以及後續的分析方向。

  • 賽題理解的評價指標

    這部分會涉及後續模型預測中兩個很重要的問題:
    1. 本地模型的驗證方式,很多情況下,線上驗證是有一定的時間和次數限制的,所以在比賽中構建一個合理的本地的驗證集和驗證的評價指標是很關鍵的步驟,能有效的節省很多時間
    2. 不同的指標對於同樣的預測結果是具有誤差敏感的差異性的,比如AUC,logloss, MAE,RSME,或者一些特定的評價函數。是會有很大可能會影響後續一些預測的側重點。

  • 賽題背景中可能潛在隱藏的條件:

    其實賽題中有些說明是很有利益的, 都可以在後續答辯中以及問題思考中 所體現出來的,比如高效性要求,比如對於數據異常的識別處理,比如工序流程的差異性,比如模型運行的 時間,模型的魯棒性,有些的意識是可以貫穿問題思考,特徵,模型以及後續處理的,也有些會對於特徵構建或者選擇模型上有很大益處,反過來如果在模型預測效果不好,其實有時也要反過來思考,是不是賽題 背景有沒有哪方面理解不清晰或者什麼其中的問題沒考慮到。

今天的整理就到這裏了,熱身結束, 後面就是真正的對於這個比賽的實戰了,分爲數據探索性分析, 數據清洗,特徵工程,建模調參和模型融合這幾個步驟, 這五個步驟,會有五篇文章進行整理,也算是對之前學習的知識和這次學習知識的一個大整合,通過這幾個步驟,應該可以入門數據挖掘了,後面就是不斷的通過比賽和項目進行自己探索,總結的過程了,加油 😉。

對了,關於這個比賽, 今天玩了那個baseline版本,不過我稍微改了一下, 提交了兩次,第一次是把預測值過大的樣本刪除掉,結果是803.0332, 然後我感覺這樣做可能不太妥當,畢竟這種極差值對於模型影響還是比較大的,所以第二次我保留了下來, 又訓練提交,這次成績到了658.5030, 效果好了一些,可以發現這種極差值帶來的誤差影響會非常大。對於price的離羣點可能要做專門的分析。

當然,這只是baseline版本呢, 後面我們就慢慢的學習數據挖掘技術,嘗試把分數提上去,這個過程會很爽喲!

參考

PS: 本次數據挖掘路徑學習,專題知識將在天池分享,詳情可關注公衆號Datawhale

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章