零基礎入門數據挖掘-Task1 賽題理解
xiaoyao 修改之後
一、 賽題理解
Tip:此部分爲零基礎入門數據挖掘的 Task1 賽題理解部分,爲入門數據挖掘比賽提供一個基本的賽題入門講解。
賽題:零基礎入門數據挖掘 - 二手車交易價格預測
地址:https://tianchi.aliyun.com
1.1 學習目標
- 理解賽題數據和目標,清楚評分體系。
- 完成相應報名,下載數據和結果提交打卡(可提交示例結果),熟悉比賽流程
1.2 瞭解賽題
- 賽題概況
- 數據概況
- 預測指標
- 分析賽題
1.2.1 賽題概況
賽題以預測二手車的交易價格爲任務,數據集報名後可見並可下載,該數據來自某交易平臺的二手車交易記錄,總數據量超過40w,包含31列變量信息,其中15列爲匿名變量。爲了保證比賽的公平性,將會從中抽取15萬條作爲訓練集,5萬條作爲測試集A,5萬條作爲測試集B,同時會對name、model、brand和regionCode等信息進行脫敏。
通過這道賽題來引導大家走進 AI 數據競賽的世界,主要針對於於競賽新人進行自我練
習、自我提高。
1.2.2 數據概況
一般而言,對於數據在比賽界面都有對應的數據概況介紹(匿名特徵除外),說明列的性質特徵。瞭解列的性質會有助於我們對於數據的理解和後續分析。
Tip:匿名特徵,就是未告知數據列所屬的性質的特徵列。
train.csv
- SaleID - 銷售樣本ID
- name - 汽車編碼
- regDate - 汽車註冊時間
- model - 車型編碼
- brand - 品牌
- bodyType - 車身類型
- fuelType - 燃油類型
- gearbox - 變速箱
- power - 汽車功率
- kilometer - 汽車行駛公里
- notRepairedDamage - 汽車有尚未修復的損壞
- regionCode - 看車地區編碼
- seller - 銷售方
- offerType - 報價類型
- creatDate - 廣告發布時間
- price - 汽車價格
- v_0’, ‘v_1’, ‘v_2’, ‘v_3’, ‘v_4’, ‘v_5’, ‘v_6’, ‘v_7’, ‘v_8’, ‘v_9’, ‘v_10’, ‘v_11’, ‘v_12’, ‘v_13’,‘v_14’ 【匿名特徵,包含v0-14在內15個匿名特徵】
數字全都脫敏處理,都爲label encoding形式,即數字形式
1.2.3 預測指標
本賽題的評價標準爲MAE(Mean Absolute Error):
其中代表第個樣本的真實值,其中代表第個樣本的預測值。
一般問題評價指標說明:
什麼是評估指標:
評估指標即是我們對於一個模型效果的數值型量化。(有點類似與對於一個商品評價打分,而這是針對於模型效果和理想效果之間的一個打分)
一般來說分類和迴歸問題的評價指標有如下一些形式:
分類算法常見的評估指標如下:
- 對於二類分類器/分類算法,評價指標主要有accuracy, [Precision,Recall,F-score,Pr曲線],ROC-AUC曲線。
- 對於多類分類器/分類算法,評價指標主要有accuracy, [宏平均和微平均,F-score]。
對於迴歸預測類常見的評估指標如下:
- 平均絕對誤差(Mean Absolute Error,MAE),均方誤差(Mean Squared Error,MSE),平均絕對百分誤差(Mean Absolute Percentage Error,MAPE),均方根誤差(Root Mean Squared Error), R2(R-Square)
平均絕對誤差
平均絕對誤差(Mean Absolute Error,MAE):平均絕對誤差,其能更好地反映預測值與真實值誤差的實際情況,其計算公式如下:
均方誤差
均方誤差(Mean Squared Error,MSE),均方誤差,其計算公式爲:
R2(R-Square)的公式爲:
殘差平方和:
總平均值:
其中表示的平均值
得到表達式爲:
用於度量因變量的變異中可由自變量解釋部分所佔的比例,取值範圍是 0~1,越接近1,表明迴歸平方和佔總平方和的比例越大,迴歸線與各觀測點越接近,用x的變化來解釋y值變化的部分就越多,迴歸的擬合程度就越好。所以也稱爲擬合優度(Goodness of Fit)的統計量。
表示真實值,表示預測值,表示樣本均值。得分越高擬合效果越好。
1.2.4. 分析賽題
- 此題爲傳統的數據挖掘問題,通過數據科學以及機器學習深度學習的辦法來進行建模得到結果。
- 此題是一個典型的迴歸問題。
- 主要應用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等數據挖掘常用庫或者框架來進行數據挖掘任務。
- 通過EDA來挖掘數據的聯繫和自我熟悉數據。
1.3 代碼示例
本部分爲對於數據讀取和指標評價的示例。
1.3.1 數據讀取pandas
%pwd
'D:\\python code\\2tianchi competition\\二手車交易預測'
# 導入package
import pandas as pd
import numpy as np
## 1) 載入訓練集和測試集;
path = './data/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')
# 查看訓練數集和測試集形狀
print('Train data shape:',Train_data.shape)
print('TestA data shape:',Test_data.shape)
Train data shape: (150000, 31)
TestA data shape: (50000, 30)
Train_data.head()
SaleID | name | regDate | model | brand | bodyType | fuelType | gearbox | power | kilometer | ... | v_5 | v_6 | v_7 | v_8 | v_9 | v_10 | v_11 | v_12 | v_13 | v_14 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 736 | 20040402 | 30.0 | 6 | 1.0 | 0.0 | 0.0 | 60 | 12.5 | ... | 0.235676 | 0.101988 | 0.129549 | 0.022816 | 0.097462 | -2.881803 | 2.804097 | -2.420821 | 0.795292 | 0.914762 |
1 | 1 | 2262 | 20030301 | 40.0 | 1 | 2.0 | 0.0 | 0.0 | 0 | 15.0 | ... | 0.264777 | 0.121004 | 0.135731 | 0.026597 | 0.020582 | -4.900482 | 2.096338 | -1.030483 | -1.722674 | 0.245522 |
2 | 2 | 14874 | 20040403 | 115.0 | 15 | 1.0 | 0.0 | 0.0 | 163 | 12.5 | ... | 0.251410 | 0.114912 | 0.165147 | 0.062173 | 0.027075 | -4.846749 | 1.803559 | 1.565330 | -0.832687 | -0.229963 |
3 | 3 | 71865 | 19960908 | 109.0 | 10 | 0.0 | 0.0 | 1.0 | 193 | 15.0 | ... | 0.274293 | 0.110300 | 0.121964 | 0.033395 | 0.000000 | -4.509599 | 1.285940 | -0.501868 | -2.438353 | -0.478699 |
4 | 4 | 111080 | 20120103 | 110.0 | 5 | 1.0 | 0.0 | 0.0 | 68 | 5.0 | ... | 0.228036 | 0.073205 | 0.091880 | 0.078819 | 0.121534 | -1.896240 | 0.910783 | 0.931110 | 2.834518 | 1.923482 |
5 rows × 31 columns
1.3.2 分類指標評價計算示例
## accuracy 精確率是一個二分類指標,而準確率能用於多分類。
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 1]
print('ACC:',accuracy_score(y_true, y_pred))
ACC: 0.75
## Precision,Recall,F1-score 精確率/查準率, 查全率,,F1值
from sklearn import metrics
y_pred = [0, 1, 0, 0]
y_true = [0, 1, 0, 1]
print('Precision',metrics.precision_score(y_true, y_pred))
print('Recall',metrics.recall_score(y_true, y_pred))
print('F1-score:',metrics.f1_score(y_true, y_pred))
Precision 1.0
Recall 0.5
F1-score: 0.6666666666666666
## Roc曲線的繪製
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc ###計算roc和auc
# from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
# Import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target
##變爲2分類
X, y = X[y != 2], y[y != 2]
# Add noisy features to make the problem harder
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3,random_state=0)
# Learn to predict each class against the other
svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)
###通過decision_function()計算得到的y_score的值,用在roc_curve()函數中
y_score = svm.fit(X_train, y_train).decision_function(X_test)
# Compute ROC curve and ROC area for each class
fpr,tpr,threshold = roc_curve(y_test, y_score) ###計算真正率和假正率
roc_auc = auc(fpr,tpr) ###計算auc的值
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率爲橫座標,真正率爲縱座標做曲線
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
<Figure size 432x288 with 0 Axes>
from sklearn.metrics import roc_curve, auc
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr,tpr,threshold = roc_curve(y_true, y_scores) ###計算真正率和假正率
roc_auc = auc(fpr,tpr) ###計算auc的值
lw = 2
plt.plot(fpr, tpr, color='darkorange',
label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.legend(loc="lower right")
plt.show()
## AUC
import numpy as np
from sklearn.metrics import roc_auc_score
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))
AUC socre: 0.75
1.3.3 迴歸指標評價計算示例
平均絕對誤差(MAE)
也叫做範數損失,計算公式如下:
其中, 爲樣本數,爲第條樣本的真實值,爲第條樣本的預測值。模型使用MAE作爲損失函數,則是對數據分佈的中指進行擬合。某些模型比如(XGBoost)必須要求損失函數有二階導數,所以不能直接優化MAE。
加權平均絕對誤差(WMAE)
對每條樣本考慮不同的權重,比如考慮時間因素,距離當前時間越久的樣本權重越低,計算公式如下:
其中,是每條樣本的權重。
平均絕對百分誤差(MAPE)
MAPE通過計算絕對誤差百分比來表示預測效果,取值越小越好。如果MAPE=10, 表示預測平均偏離真實值10%。MAPE計算與量綱無關,因此在特定場景下,不同問題具有一定可比性。
計算公式如下:
MAPE對負值誤差的懲罰大於正值誤差。
均方根誤差(RMSE)
RMSE代表的是,預測值與真實值差值的樣本標準差。和MAE相比,RMSE對大誤差樣本有更大的懲罰,但他也對離羣點敏感,健壯性不如MAE。
計算公式如下:
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))
MSE: 0.2871428571428571
RMSE: 0.5358571238146014
MAE: 0.4142857142857143
MAPE: 0.1461904761904762
## R2-score
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print('R2-score:',r2_score(y_true, y_pred))
R2-score: 0.9486081370449679
1.4 經驗總結
-
作爲切入一道賽題的基礎,賽題理解是極其重要的,對於賽題的理解甚至會影響後續的特徵工程構建以及模型的選擇,最主要是會影響後續發展工作的方向,比如挖掘特徵的方向或者存在問題解決問題的方向,對了賽題背後的思想以及賽題業務邏輯的清晰,也很有利於花費更少時間構建更爲有效的特徵模型,賽題理解要達到的地步是什麼呢,把一道賽題轉化爲一種宏觀理解的解決思路。以下將從多方面對於此進行說明:
-
- 1) 賽題理解究竟是理解什麼:
理解賽題是不是把一道賽題的背景介紹讀一遍就OK了呢?並不是的,理解賽題其實也是從直觀上梳理問題,分析問題是否可行的方法,有多少可行度,賽題做的價值大不大,理清一道賽題要從背後的賽題背景引發的賽題任務理解其中的任務邏輯,可能對於賽題有意義的外在數據有哪些,並對於賽題數據有一個初步瞭解,知道現在和任務的相關數據有哪些,其中數據之間的關聯邏輯是什麼樣的。 對於不同的問題,在處理方式上的差異是很大的。如果用簡短的話來說,並且在比賽的角度或者做工程的角度,就是該賽題符合的問題是什麼問題,大概要去用哪些指標,哪些指標是否會做到線上線下的一致性,是否有效的利於我們進一步的探索更高線上分數的線下驗證方法,在業務上,你是否對很多原始特徵有很深刻的瞭解,並且可以通過EDA來尋求他們直接的關係,最後構造出滿意的特徵。
- 1) 賽題理解究竟是理解什麼:
-
- 2) 有了賽題理解後能做什麼:
在對於賽題有了一定的瞭解後,分析清楚了問題的類型性質和對於數據理解的這一基礎上,是不是賽題理解就做完了呢? 並不是的,就像摸清了敵情後,我們至少就要有一些相應的理解分析,比如這題的難點可能在哪裏,關鍵點可能在哪裏,哪些地方可以挖掘更好的特徵,用什麼樣得線下驗證方式更爲穩定,出現了過擬合或者其他問題,估摸可以用什麼方法去解決這些問題,哪些數據是可靠的,哪些數據是需要精密的處理的,哪部分數據應該是關鍵數據(背景的業務邏輯下,比如CTR的題,一個尋常顧客大體會有怎麼樣的購買行爲邏輯規律,或者風電那種題,如果機組比較鄰近,相關一些風速,轉速特徵是否會很近似)。這時是在一個宏觀的大體下分析的,有助於摸清整個題的思路脈絡,以及後續的分析方向。
- 2) 有了賽題理解後能做什麼:
-
- 3) 賽題理解的-評價指標:
爲什麼要把這部分單獨拿出來呢,因爲這部分會涉及後續模型預測中兩個很重要的問題:
1. 本地模型的驗證方式,很多情況下,線上驗證是有一定的時間和次數限制的,所以在比賽中構建一個合理的本地的驗證集和驗證的評價指標是很關鍵的步驟,能有效的節省很多時間。
2. 不同的指標對於同樣的預測結果是具有誤差敏感的差異性的,比如AUC,logloss, MAE,RSME,或者一些特定的評價函數。是會有很大可能會影響後續一些預測的側重點。
- 3) 賽題理解的-評價指標:
-
- 4) 賽題背景中可能潛在隱藏的條件:
其實賽題中有些說明是很有利益-都可以在後續答辯中以及問題思考中所體現出來的,比如高效性要求,比如對於數據異常的識別處理,比如工序流程的差異性,比如模型運行的時間,比模型的魯棒性,有些的意識是可以貫穿問題思考,特徵,模型以及後續處理的,也有些會對於特徵構建或者選擇模型上有很大益處,反過來如果在模型預測效果不好,其實有時也要反過來思考,是不是賽題背景有沒有哪方面理解不清晰或者什麼其中的問題沒考慮到。
- 4) 賽題背景中可能潛在隱藏的條件: