二手車預測:task1:賽題分析


train.csv

  • 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’(根據汽車的評論、標籤等大量信息得到的embedding向量)【人工構造 匿名特徵】

數字全都脫敏處理,都爲label encoding形式,即數字形式


本賽題的評價標準爲MAE(Mean Absolute Error):

MAE=i=1nyiy^in MAE=\frac{\sum_{i=1}^{n}\left|y_{i}-\hat{y}_{i}\right|}{n}
其中yiy_{i}代表第ii個樣本的真實值,其中y^i\hat{y}_{i}代表第ii個樣本的預測值。
其實就是sse的一個開方

一般問題評價指標說明:*

什麼是評估指標:

評估指標即是我們對於一個模型效果的數值型量化。(有點類似與對於一個商品評價打分,而這是針對於模型效果和理想效果之間的一個打分)

一般來說分類和迴歸問題的評價指標有如下一些形式:

分類算法常見的評估指標如下:

  • 對於二類分類器/分類算法,評價指標主要有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):平均絕對誤差,其能更好地反映預測值與真實值誤差的實際情況,其計算公式如下:
MAE=1Ni=1Nyiy^i MAE=\frac{1}{N} \sum_{i=1}^{N}\left|y_{i}-\hat{y}_{i}\right|

均方誤差
均方誤差(Mean Squared Error,MSE),均方誤差,其計算公式爲:
MSE=1Ni=1N(yiy^i)2 MSE=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\hat{y}_{i}\right)^{2}

R2(R-Square)的公式爲
殘差平方和:
SSres=(yiy^i)2 SS_{res}=\sum\left(y_{i}-\hat{y}_{i}\right)^{2}
總平均值:
SStot=(yiyi)2 SS_{tot}=\sum\left(y_{i}-\overline{y}_{i}\right)^{2}

其中y\overline{y}表示yy的平均值
得到R2R^2表達式爲:
R2=1SSresSStot=1(yiy^i)2(yiy)2 R^{2}=1-\frac{SS_{res}}{SS_{tot}}=1-\frac{\sum\left(y_{i}-\hat{y}_{i}\right)^{2}}{\sum\left(y_{i}-\overline{y}\right)^{2}}
R2R^2用於度量因變量的變異中可由自變量解釋部分所佔的比例,取值範圍是 0~1,R2R^2越接近1,表明迴歸平方和佔總平方和的比例越大,迴歸線與各觀測點越接近,用x的變化來解釋y值變化的部分就越多,迴歸的擬合程度就越好。所以R2R^2也稱爲擬合優度(Goodness of Fit)的統計量。

yiy_{i}表示真實值,y^i\hat{y}_{i}表示預測值,yi\overline{y}_{i}表示樣本均值。得分越高擬合效果越好。

數據讀取

import pandas as pd
import numpy as np
# 路徑改成自己的
train = pd.read_csv('/home/ach/下載/數據挖掘/used_car_train_20200313.csv', sep=' ')
test = pd.read_csv('/home/ach/下載/數據挖掘/used_car_testA_20200313.csv', sep=' ')
print('Train data shape:',train.shape)
print('TestA data shape:',test.shape)
Train data shape: (150000, 31)
TestA data shape: (50000, 30)
train.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

評價指標:準確度

## 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
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))#The F1 Score is the 2*((precision*recall)/(precision+recall))
# F1分數越高,結果就越穩健
Precision 1.0
Recall 0.5
F1-score: 0.6666666666666666
## 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))
#TPRate的意義是所有真實類別爲1的樣本中,預測類別爲1的比例。
#FPRate的意義是所有真實類別爲0的樣本中,預測類別爲1的比例。
#AUC即ROC曲線下的面積,而ROC曲線的橫軸是FPRate,縱軸是TPRate,當二者相等時,即y=x,
# auc就是計算我們混淆矩陣中在roc下的面積,大於0.5,如果等於0.5,效果不好
#AUC的優勢,AUC的計算方法同時考慮了分類器對於正例和負例的分類能力,在樣本不平衡的情況下,依然能夠對分類器作出合理的評價
AUC socre: 0.75

迴歸的指標計算

# coding=utf-8
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) 賽題理解究竟是理解什麼:
    理解賽題是不是把一道賽題的背景介紹讀一遍就OK了呢?並不是的,理解賽題其實也是從直觀上梳理問題,分析問題是否可行的方法,有多少可行度,賽題做的價值大不大,理清一道賽題要從背後的賽題背景引發的賽題任務理解其中的任務邏輯,可能對於賽題有意義的外在數據有哪些,並對於賽題數據有一個初步瞭解,知道現在和任務的相關數據有哪些,其中數據之間的關聯邏輯是什麼樣的。 對於不同的問題,在處理方式上的差異是很大的。如果用簡短的話來說,並且在比賽的角度或者做工程的角度,就是該賽題符合的問題是什麼問題,大概要去用哪些指標,哪些指標是否會做到線上線下的一致性,是否有效的利於我們進一步的探索更高線上分數的線下驗證方法,在業務上,你是否對很多原始特徵有很深刻的瞭解,並且可以通過EDA來尋求他們直接的關係,最後構造出滿意的特徵。

  • 2) 有了賽題理解後能做什麼:
    在對於賽題有了一定的瞭解後,分析清楚了問題的類型性質和對於數據理解的這一基礎上,是不是賽題理解就做完了呢? 並不是的,就像摸清了敵情後,我們至少就要有一些相應的理解分析,比如這題的難點可能在哪裏,關鍵點可能在哪裏,哪些地方可以挖掘更好的特徵,用什麼樣得線下驗證方式更爲穩定,出現了過擬合或者其他問題,估摸可以用什麼方法去解決這些問題,哪些數據是可靠的,哪些數據是需要精密的處理的,哪部分數據應該是關鍵數據(背景的業務邏輯下,比如CTR的題,一個尋常顧客大體會有怎麼樣的購買行爲邏輯規律,或者風電那種題,如果機組比較鄰近,相關一些風速,轉速特徵是否會很近似)。這時是在一個宏觀的大體下分析的,有助於摸清整個題的思路脈絡,以及後續的分析方向。

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

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


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