天池&Datawhale--零基礎入門數(shù)據(jù)挖掘 Task1&Task2

一、賽題理解


1、賽題題目:零基礎入門數(shù)據(jù)挖掘 - 二手車交易價格預測

2套硼、?賽題概況

訓練集:15萬條

測試集A:5萬條

測試集B:5萬條

特征+標簽(包括15個顯著特征和15個匿名特征)

SaleID - 銷售樣本ID

name - 汽車編碼

regDate - 汽車注冊時間

model - 車型編碼

brand - 品牌

bodyType - 車身類型

fuelType - 燃油類型

gearbox - 變速箱

power - 汽車功率

kilometer - 汽車行駛公里

notRepairedDamage - 汽車有尚未修復的損壞

regionCode - 看車地區(qū)編碼

seller - 銷售方

offerType - 報價類型

creatDate - 廣告發(fā)布時間

和規(guī)范化

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在內(nèi)15個匿名特征】

3、 預測指標

本賽題為典型的回歸問題钠右,賽題使用的評價標準為MAE(Mean Absolute Error)

一般問題評價指標說明:

分類問題:①對于二類分類器/分類算法赋元,評價指標主要有accuracy, [Precision,Recall搁凸,F(xiàn)-score媚值,Pr曲線],ROC-AUC曲線护糖。②對于多類分類器/分類算法褥芒,評價指標主要有accuracy, [宏平均和微平均嫡良,F(xiàn)-score]锰扶。

回歸問題:平均絕對誤差(Mean Absolute Error,MAE)寝受,均方誤差(Mean Squared Error坷牛,MSE),平均絕對百分誤差(Mean Absolute Percentage Error很澄,MAPE)京闰,均方根誤差(Root Mean Squared Error), R2(R-Square)

分類指標評價計算示例

## 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))

結果:Precision 1.0

Recall 0.5

F1-score: 0.666666666667

## 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

回歸指標評價計算示例

# coding=utf-8

import numpy as np

from sklearn import metrics

# MAPE需要自己實現(xiàn)

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.287142857143

RMSE: 0.535857123815

MAE: 0.414285714286

MAPE: 0.14619047619

## 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.948608137045

4甩苛、寶貴的前人經(jīng)驗

1) 賽題理解究竟是理解什么:①分析賽題的任務邏輯②尋找賽題數(shù)據(jù)的關聯(lián)邏輯②尋找對賽題可能有意義的外在數(shù)據(jù)④如何做到線上線下的一致性⑤EDA

2) 有了賽題理解后能做什么:①分析賽題的難點蹂楣,關鍵點,突破點②分析那些數(shù)據(jù)可靠讯蒲,哪些數(shù)據(jù)需要進行精密處理捐迫,哪些數(shù)據(jù)時關鍵數(shù)據(jù)(此處可以通過業(yè)務進行一些分析)

3) 賽題理解的-評價指標:①構建一個合理的本地的驗證集和驗證的評價指標②不同的評價指標有一定的差異性,這值得注意

4) 賽題背景中可能潛在隱藏的條件:遇到問題爱葵,反復斟酌賽題背景

二施戴、EDA-數(shù)據(jù)探索性分析

1、EDA目標

①EDA的價值主要在于熟悉數(shù)據(jù)集萌丈,了解數(shù)據(jù)集赞哗,對數(shù)據(jù)集進行驗證來確定所獲得數(shù)據(jù)集可以用于接下來的機器學習或者深度學習使用。

②當了解了數(shù)據(jù)集之后我們下一步就是要去了解變量間的相互關系以及變量與預測值之間的存在關系辆雾。

③引導數(shù)據(jù)科學從業(yè)者進行數(shù)據(jù)處理以及特征工程的步驟,使數(shù)據(jù)集的結構和特征集讓接下來的預測問題更加可靠肪笋。

④完成對于數(shù)據(jù)的探索性分析,并對于數(shù)據(jù)進行一些圖表或者文字總結并打卡度迂。

2藤乙、EDA代碼示例

1、載入各種數(shù)據(jù)科學以及可視化庫

#coding:utf-8

#導入warnings包惭墓,利用過濾器來實現(xiàn)忽略警告語句坛梁。

import warnings

warnings.filterwarnings('ignore')

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

import missingno as msno

2、載入數(shù)據(jù)(遇到問題:文件中斜杠盡量用\,不要用/)

## 1) 載入訓練集和測試集划咐;

path = './datalab/231784/'

Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')

Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')

## 2) 簡略觀察數(shù)據(jù)(head()+shape)

Train_data.head().append(Train_data.tail())

Train_data.shape

Test_data.head().append(Train_data.tail())

Test_data.shape

3拴念、總覽數(shù)據(jù)概況

## 1) 通過describe()來熟悉數(shù)據(jù)的相關統(tǒng)計量(包括count,mean褐缠,std政鼠,min,25%队魏,50%公般,75%,max)

Train_data.describe()

Test_data.describe()

## 2) 通過info()來熟悉數(shù)據(jù)類型(顯示每一列的數(shù)據(jù)類型)

Train_data.info()

Test_data.info()

4胡桨、判斷數(shù)據(jù)缺失和異常

## 1) 查看每列的存在nan情況

Train_data.isnull().sum()

Test_data.isnull().sum()

# nan可視化

missing = Train_data.isnull().sum()

missing = missing[missing > 0]

missing.sort_values(inplace=True)

missing.plot.bar()

# 可視化看下缺省值(sample是隨機采樣函數(shù))

msno.matrix(Train_data.sample(250))? ??

#熱力圖(展示的是兩個特征的缺失關系--從-1到1)

msno.heatmap(Train_data,figsize=(7, 7))#figsize是指圖的大小

msno.bar(Train_data.sample(1000))

# 可視化看下缺省值

msno.matrix(Test_data.sample(250))

msno.bar(Test_data.sample(1000))

## 2) 查看異常值檢測

Train_data.info()

運行上述代碼可以看出發(fā)現(xiàn)除了notRepairedDamage 為object類型其他都為數(shù)字官帘,這里我們把他的幾個不同的值都進行顯示就知道了

Train_data['notRepairedDamage'].value_counts()? #顯示notRepairedDamage各值的個數(shù)

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True) #替換

Train_data['notRepairedDamage'].value_counts()

Train_data.isnull().sum()

Test_data['notRepairedDamage'].value_counts()

Test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

#以下有兩個類別特征嚴重傾斜

Train_data["seller"].value_counts()

Train_data["offerType"].value_counts()

del Train_data["seller"]

del Train_data["offerType"]

del Test_data["seller"]

del Test_data["offerType"]

5、了解預測值的分布

Train_data['price']

Train_data['price'].value_counts()

## 1) 總體分布概況(無界約翰遜分布等)

import scipy.stats as st

y = Train_data['price']

plt.figure(1); plt.title('Johnson SU')

sns.distplot(y, kde=False, fit=st.johnsonsu)

plt.figure(2); plt.title('Normal')

sns.distplot(y, kde=False, fit=st.norm)

plt.figure(3); plt.title('Log Normal')

sns.distplot(y, kde=False, fit=st.lognorm)

## 2) 查看skewness and kurtosis

sns.distplot(Train_data['price']);

print("Skewness: %f" % Train_data['price'].skew())

print("Kurtosis: %f" % Train_data['price'].kurt())

Train_data.skew(), Train_data.kurt()

sns.distplot(Train_data.skew(),color='blue',axlabel ='Skewness')

sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')

## 3) 查看預測值的具體頻數(shù)

plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')

plt.show()

6登失、特征分為類別特征和數(shù)字特征遏佣,并對類別特征查看unique分布

# 分離label即預測值

Y_train = Train_data['price']

# 這個區(qū)別方式適用于沒有直接label coding的數(shù)據(jù)

# 這里不適用挖炬,需要人為根據(jù)實際含義來區(qū)分

# 數(shù)字特征

# numeric_features = Train_data.select_dtypes(include=[np.number])

# numeric_features.columns

# # 類型特征

# categorical_features = Train_data.select_dtypes(include=[np.object])

# categorical_features.columns

numeric_features = ['power', 'kilometer', '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' ]

categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode',]

# 特征nunique分布

for cat_fea in categorical_features:

? ? print(cat_fea + "的特征分布如下:")

? ? print("{}特征有個{}不同的值".format(cat_fea, Train_data[cat_fea].nunique()))

? ? print(Train_data[cat_fea].value_counts())

# 特征nunique分布

for cat_fea in categorical_features:

? ? print(cat_fea + "的特征分布如下:")

? ? print("{}特征有個{}不同的值".format(cat_fea, Test_data[cat_fea].nunique()))

? ? print(Test_data[cat_fea].value_counts())

7揽浙、數(shù)字特征分析

numeric_features.append('price')

numeric_features

Train_data.head()????

## 1) 相關性分析

price_numeric = Train_data[numeric_features]

correlation = price_numeric.corr()

print(correlation['price'].sort_values(ascending = False),'\n')

f , ax = plt.subplots(figsize = (7, 7))

plt.title('Correlation of Numeric Features with Price',y=1,size=16)

sns.heatmap(correlation,square = True,? vmax=0.8)?

#square使每個單元格為正方形

#annot: 默認為False,為True的話意敛,會在格子上顯示數(shù)字

#vmax, vmin: 熱力圖顏色取值的最大值馅巷,最小值,默認會從data中推導

del price_numeric['price']

## 2) 查看幾個特征得 偏度和峰值

for col in numeric_features:

? ? print('{:15}'.format(col),

? ? ? ? ? 'Skewness: {:05.2f}'.format(Train_data[col].skew()) ,

? ? ? ? ? '? ' ,

? ? ? ? ? 'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())?

? ? ? ? )

## 3) 每個數(shù)字特征得分布可視化

f = pd.melt(Train_data, value_vars=numeric_features)

g = sns.FacetGrid(f, col="variable",? col_wrap=2, sharex=False, sharey=False)

g = g.map(sns.distplot, "value")

```swift

print("ok")

```

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草姻,一起剝皮案震驚了整個濱河市钓猬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撩独,老刑警劉巖敞曹,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異综膀,居然都是意外死亡澳迫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門剧劝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄登,“玉大人,你說我怎么就攤上這事讥此÷G拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵萄喳,是天一觀的道長卒稳。 經(jīng)常有香客問我,道長他巨,這世上最難降的妖魔是什么展哭? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任湃窍,我火速辦了婚禮,結果婚禮上匪傍,老公的妹妹穿的比我還像新娘您市。我一直安慰自己,他們只是感情好役衡,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布茵休。 她就那樣靜靜地躺著,像睡著了一般手蝎。 火紅的嫁衣襯著肌膚如雪榕莺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天棵介,我揣著相機與錄音钉鸯,去河邊找鬼。 笑死邮辽,一個胖子當著我的面吹牛唠雕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吨述,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼岩睁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揣云?” 一聲冷哼從身側響起捕儒,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邓夕,沒想到半個月后刘莹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡焚刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年点弯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汪榔。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒲拉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痴腌,到底是詐尸還是另有隱情雌团,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布士聪,位于F島的核電站锦援,受9級特大地震影響,放射性物質發(fā)生泄漏剥悟。R本人自食惡果不足惜灵寺,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一曼库、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧略板,春花似錦毁枯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間章鲤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工祭示, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谴古。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓质涛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讥电。 傳聞我的和親對象是個殘疾皇子蹂窖,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容