零基礎數據挖掘入門系列(二) - 數據的探索性(EDA)分析

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

1. 寫在前面

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

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

今天是本系列的第二篇數據的EDA探索分析,這一塊主要是對數據進行一個探索,幫助我們瞭解和熟悉數據,只有真正的瞭解數據,我們才能更好的進行後面的特徵工程等處理,所以這一步也是非常重要的,所以這次會整理各種數據探索性分析的技巧,依然是圍繞着上面的比賽進行展開論述,爲了增加趣味性,我把數據探索這一塊分成了五個維度,依然是採用將夜裏面昊天世界的修煉等級境界來命名,分爲數據初識,數據感知,數據不惑,數據洞玄和數據知命。因爲學習的本身也是一場修行,相信通過這篇文章,能夠修習到不錯的數據探索技巧。

對了,今天的這篇文章是整理各種數據探索技巧,所以應該會很長(代碼運行結果中只會給出重要的部分,畢竟爲了以後查閱的時候方便,結果圖片太多,反而影響查看,具體的代碼結果我後面會給出參考鏈接),並且既然是圍繞着二手車價格預測的比賽展開,得先對這個比賽進行理解,當然這一個我已經從熱身篇整理完畢,可以先行查看零基礎數據挖掘入門系列(一) - 賽題理解

大綱如下:

  • 數據初識(初識境對數據做初步探索,查看形狀,字段類型,相關統計量等)
  • 數據感知(感知境在初識的基礎上進一步挖掘信息,主要包括數據的缺失情況和異常情況)
  • 數據不惑(不惑境是前兩個基礎上進一步挖掘,包括查看預測值的分佈和字段的類型判斷)
  • 數據洞玄(洞玄境對數值特徵和類別特徵分開挖掘,包括類別偏斜,類別分佈可視化,數值相關等各種可視化技巧)
  • 數據知命(知名境介紹pandas_profiling數據探索性分析的神器,通過這個神器可以對對上面的知識進行整合)
  • 對知識和技巧進行總結

Ok, let’s go!

再此之前,我們先導入一些包和數據集:

# 基礎工具包即可
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno   # 缺失值的可視化處理


"""導入數據集"""
train_data = pd.read_csv('./dataset/used_car_train_20200313.csv', sep=' ')   # 這個地方注意需要指定分隔符空格
test_data = pd.read_csv('./dataset/used_car_testA_20200313.csv', sep=' ')

2. 數據初識

數據初識部分就是數據的初步探索, 這一塊主要是對導入的數據有一個大致的瞭解,做到初識數據,包括數據簡識(head,tail),行列信息(shape),數據的統計特徵(describe),數據的信息(info)等。

# 查看數據的形狀 注意數據的行和列, 必須對數據非常瞭解
print('train_data_shape:', train_data.shape)
print('test_data_shape:', test_data.shape)

# 數據簡要概覽
train_data.head().append(train_data.tail())
test_data.head().append(test_data.tail())

這個,我們要看一下結果:
在這裏插入圖片描述
從形狀可以看出訓練集共150000個樣本, 30列特徵,一列價格,測試集50000個樣本,30列特徵

trick1: 要養成看數據集的head()以及shape的習慣,這會讓你每一步更放心,不會導致接下里的連串的錯誤, 如果對自己的 pandas等操作不放心,建議執行一步看一下,這樣會有效的方便你進行理解函數並進行操作

PS: 數據的維度很重要, 太多的行會導致花費大量時間來訓練算法得到模型, 太少的數據會導致對算法訓練不充分,得不到合適的模型 如果數據有太多的特徵,會引起某些算法性能低下的問題。所以一定要先熟悉於心。

# 數據信息查看 .info()可以看到每列的type,以及NAN缺失信息
train_data.info()

這一個看一下結果:
在這裏插入圖片描述
通過info就可以發現幾點信息: 首先就是字段的類型, 有一個object,後面就需要單獨處理。 其次就是有一些字段有空值,清洗的時候就要處理缺失。

通過info來了解數據每列的type,有助於瞭解是否存在除了nan以外的特殊符號異常

# 通過.columns查看列名
train_data.columns

# 數據的統計信息概覽 數據記錄數,平均值,標準方差, 最小值,下四分位數, 中位數, 上四分位數,最大值
train_data.describe()

describe中有每列(數值列)的統計量,個數count、平均值mean、方差std、最小值min、中位數25% 50% 75% 、以 及最大值 看這個信息主要是瞬間掌握數據的大概的範圍以及每個值的異常值的判斷,比如有的時候會發現 999 9999 -1 等值這些其實都是nan的另外一種表達方式,有的時候需要注意下。
在這裏插入圖片描述
會發現,統計特徵這個會有30列,我們上面輸出形狀的時候明明train_data有31列啊? 注意,這裏面是不包括那個object類型的那個字段的統計的,畢竟不是數值類型的, 沒法找中位數,均值啥的, 當然那一個可以用describe單獨看看,你就會發現數值型和object用describe的區別。

train_data['notRepairedDamage'].describe()

# 結果:
count     150000
unique         3
top          0.0
freq      111361
Name: notRepairedDamage, dtype: object

好了,從初識境中,我們已經看到了數據的維度,瞭解了數據的字段類型和統計特徵,算是一個初步相識吧,下面我們就進入感知。

3. 數據感知

數據感知在數據初識的基礎上,進一步挖掘信息, 主要包括數據的缺失和異常等信息

# 查看每列的存在nan的情況
train_data.isnull().sum()
test_data.isnull().sum()

看一下結果:
在這裏插入圖片描述
可以發現, bodytype, fueltype和gearbox有缺失值, 還可以對nan進行可視化,變得更加明顯

missing = train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

結果如下:
在這裏插入圖片描述
Trick2: 通過以上兩句可以很直觀的瞭解哪些列存在 “nan”, 並可以把nan的個數打印,主要的目的在於 nan存在的個數是 否真的很大,如果很小一般選擇填充,如果使用lgb等樹模型可以直接空缺,讓樹自己去優化,但如果nan存在的過多、可以考慮刪掉。

下面是可視化缺省值, 用到msno這個包

# 可視化看下缺省值
msno.matrix(train_data.sample(250))  # sample(250)表示抽取表格中250個樣本。
#msno.matrix(test_data.sample(250))
# 上圖是代碼運行後得到的結果,白線越多,代表缺失值越多

#msno.bar(train_data.sample(1000))
msno.bar(test_data.sample(1000))   # 這個結果不在這裏顯示了

看一下結果:
在這裏插入圖片描述
測試集的缺省和訓練集的差不多情況, 可視化有三列有缺省,fuelType缺省得最多, 參考缺失值可視化處理–missingno

"""異常值檢測"""
train_data.info()

上面初識數據的時候,我們使用data.info()看到了各個字段的類型,發現當時有一個object字段,這種記得要單獨拿出來看一下取值,因爲可能存在數值髒亂的情況,應該始終對數據保持一種懷疑的態度去審視,不是不相信數據本身,而是可能人爲標註的時候或許出現錯誤等。數據的檢查與修正還是挺重要的, 這裏面也提供了一點方式檢查數據數據競賽修煉筆記之工業化工生產預測, 在這裏就不詳細說方法了,因爲對於這個比賽來說,這個問題不是那麼嚴重。

trick3:對數據持着懷疑的角度審視,尤其是object字段。

# 看看object這個字段的取值情況
train_data['notRepairedDamage'].value_counts()

## 結果:
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64

會發現這裏面竟然還有個’-’, 注意,如果單看它比賽給的字段的描述,只知道0代表有未修復的損害,1代表沒有,如果我們不持着懷疑的角度,就很難發現這裏竟然有個‘-’, 這個也代表着缺失,因爲很多模型對nan有直接的處理, 這裏我們可以先不做處理,先替換爲nan, 所以字符串類型的要小心 缺失的,格式不規範的情況大有存在, 格式不規範的情況可以看我上面給出的化工生產預測的鏈接,從那裏面纔會真正體會到懷疑數據的重要性。

train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
# test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

# 這時候再看缺失  就會發現缺省值最多的是這個notRepairedDamage字段
train_data.isnull().sum()

結果如下:
在這裏插入圖片描述
這一個字段的缺失是最多的了。 對測試集也是同樣的處理方式哈。

3. 數據不惑

通過初識和感知,我們不僅認識了數據,還發現了一些異常和缺失,下面我們進入不惑,不惑部分我們會進一步挖掘數據,主要包括查看預測值的分佈和把字段分成數值型和類別型,後面要分開查看和處理。

3.1 瞭解預測值的分佈

"""查看預測值的頻數"""
train_data['price'].value_counts()

# 直方圖可視化一下
plt.hist(train_data['price'], orientation='vertical', histtype='bar', color='red')
plt.show()

這個看下結果:
在這裏插入圖片描述
查看頻數, 大於20000得值極少,其實這裏也可以把這些當作特殊得值(異常值)直接用填充或者刪掉,再往下進行, 不過直接刪掉有點風險,畢竟這是個迴歸問題,我在跑baseline的時候試過,效果不太好。

"""總體分佈概況(無界約翰遜分佈等)"""
import scipy.stats as st
y = train_data['price']

plt.figure(figsize=(20,5))
plt.subplot(131); 
plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)

plt.subplot(132); 
plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)

plt.subplot(133); 
plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)

結果如下:
在這裏插入圖片描述
可以發現, 價格不服從正態,所以進行迴歸之前,它必須進行轉換。 雖然對數變換做的很好,但最佳擬合是無界約翰遜分佈。

# log變換 z之後的分佈較均勻, 可以進行log變換進行預測, 這也是預測問題常用的trick
plt.hist(np.log(train_data['price']), orientation='vertical', histtype='bar', color='red')
plt.show()

結果如下:
在這裏插入圖片描述
Trick4:對預測標籤做log轉換,使其更加服從於正態

"""查看偏度和峯度"""
sns.distplot(train_data['price'])
print('Skewness: %f' % train_data['price'].skew())
print('Kurtosis: %f' % train_data['price'].kurt())

## 結果:
Skewness: 3.346487
Kurtosis: 18.995183

結果如下:
在這裏插入圖片描述

# train_data.skew(), train_data.kurt()
plt.figure(figsize=(20,5))
plt.subplot(121)
sns.distplot(train_data.skew(), color='blue', axlabel='Skewness')
plt.subplot(122)
sns.distplot(train_data.kurt(), color='orange', axlabel='Kurtness')

在這裏插入圖片描述
峯度Kurt代表數據分佈頂的尖銳程度。偏度skew簡單來說就是數據的不對稱程度,skew、kurt說明參考https://www.cnblogs.com/wyy1480/p/10474046.html

3.2 把字段分成類別字段和數字字段分別處理

在賽題理解中,初步觀察數據字段含義的時候,我們就發現這些字段中有數值字段和類別字段,我們應該分開處理。

"""先分離出label值"""
Y_train = train_data['price']

# 這個區別方式適用於沒有直接label coding的數據 
# 這裏不適用, 需要人爲根據實際含義來區分 
# 數字特徵
# 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']
numeric_features.extend(['v_'+str(i) for i in range(15)]) 

# 這裏我感覺這個name和預測值沒有關係,所以雖然是類別,可以先去掉看看, 日期的也去掉
categorical_features = ['model', 'brand', 'bodyType', 'fuelType', 'gearbox', 
                        'notRepairedDamage','regionCode', 'seller', 'offerType']

這裏要強調的就是字段類別的分類,我們有時候需要自己去設定,這就通過觀測每一個字段的含義,和具體數據的字段類型信息去均衡了。 這裏之所以不用註釋掉的那種方式,是因爲這裏的類別字段都類似於LabelEncoder的處理了,雖然是0,1這種類別,但都已經成了數值型,所以我們需要自己設定把它們分出來。

4. 數據洞玄

不惑境我們已經分析了預測值的分佈,從分佈中我們可以看到,如果把預測值對數轉換一下效果可能會更好一些, 然後我們又把特徵字段分成了數值型和非數值型, 下面我們進入洞玄, 主要對數值特徵和類別特徵進一步分析挖掘信息,包括類別偏斜,類別分佈可視化,數值相關及可視化等。 這一塊我們要對類別型特徵和數值型特徵分開來探索,畢竟兩者的處理方式上有很大的區別的。

4.1 類別特徵的探索

類別特徵我們主要是看一下類別的取值和分佈, 會有箱型圖,小提琴圖,柱形圖等各種可視化技巧。

"""類別偏斜處理"""
for cat_fea in categorical_features:
    print(cat_fea + "特徵分佈如下:")
    print('{}特徵有{}個不同的值'.format(cat_fea, len(train_data[cat_fea].unique())))
    print(train_data[cat_fea].value_counts())
    print()

這個要在顯示結果中重點看一下類別特徵有沒有數量嚴重偏斜的情況(由於太多,不在這裏顯示),這樣的情況一般對預測沒有什麼幫助, 比如上面的seller, offerType字段,我們可以查看一下數量

train_data['seller'].value_counts()

0    149999
1         1
Name: seller, dtype: int64

train_data['offerType'].value_counts()

0    150000
Name: offerType, dtype: int64

# 這種字段對預測一般沒有幫助,我們可以刪除
del train_data['seller']
del train_data['offerType']
del test_data['seller']
del test_data['offerType']

categorical_features.remove('seller')
categorical_features.remove('offerType')

下面我們看一下類別的unique分佈

"""類別的unique分佈"""
for cat in categorical_features:
    print(len(train_data[cat].unique()))

# 結果
249
40
9
8
3
3
7905

# 因爲regionCode的類別太稀疏了,所以先去掉,因爲後面要可視化,不畫稀疏的
categorical_features.remove('regionCode')

下面我們就來學習類別特徵的各種可視化技巧

"""類別特徵箱型圖可視化"""
for c in categorical_features:
    train_data[c] = train_data[c].astype('category')
    if train_data[c].isnull().any():
        train_data[c] = train_data[c].cat.add_categories(['MISSING'])
        train_data[c] = train_data[c].fillna('MISSING')

def boxplot(x, y, **kwargs):
    sns.boxenplot(x=x, y=y)
    x = plt.xticks(rotation=90)

f = pd.melt(train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=3, sharex=False, sharey=False, size=5)
g = g.map(boxplot, "value", "price")

結果如下:
在這裏插入圖片描述

"""類別特徵的小提琴圖可視化, 小提琴圖類似箱型圖,比後者高級點,圖好看些"""
catg_list = categorical_features
target = 'price'
for catg in catg_list :
    sns.violinplot(x=catg, y=target, data=train_data)
    plt.show()

"""類別特徵的柱形圖可視化"""
def bar_plot(x, y, **kwargs):
    sns.barplot(x=x, y=y)
    x=plt.xticks(rotation=90)

f = pd.melt(train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=3, sharex=False, sharey=False, size=5)
g = g.map(bar_plot, "value", "price")

看一下柱形的結果(小提琴的不在這裏展示):
在這裏插入圖片描述

"""類別特徵的每個類別頻數可視化(count_plot)"""
def count_plot(x,  **kwargs):
    sns.countplot(x=x)
    x=plt.xticks(rotation=90)

f = pd.melt(train_data,  value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=3, sharex=False, sharey=False, size=5)
g = g.map(count_plot, "value")

這個圖還是挺好用的,可以可視化每一個類別特徵的取值分佈和數量,便於篩選異常
在這裏插入圖片描述
這裏面用到了一個melt函數,這是個轉換函數,參考這篇博客:Pandas_規整數據_轉換數據_melt()

4.2 數值特徵的探索

數值特徵的探索我們要分析相關性等,也會學習各種相關性可視化的技巧。

numeric_train_data = train_data[numeric_features]

# 把price這一列加上,這個也是數值
numeric_train_data['price'] = Y_train

"""相關性分析"""
correlation = numeric_train_data.corr()
print(correlation['price'].sort_values(ascending=False), '\n')   # 與price相關的特徵排序

.corr()可以看到每個特徵與price的相關性,我們並且排了個序。下面進行相關性可視化, 熱力圖比較合適(後面我會給出一個鏈接,是關於都可以畫哪些圖,分別是什麼情況下使用什麼圖等,這樣看到數據應該考慮什麼圖一目瞭然)

# 可視化
f, ax = plt.subplots(figsize=(10,10))
plt.title('Correlation of Numeric Features with Price', y=1, size=16)
sns.heatmap(correlation, square=True, vmax=0.8)

這個看下結果:
在這裏插入圖片描述

# 刪除price
del numeric_train_data['price']

"""查看幾個數值特徵的偏度和峯度"""
for col in numeric_train_data.columns:
     print('{:15}'.format(col), 
          'Skewness: {:05.2f}'.format(numeric_train_data[col].skew()) , 
          '   ' ,
          'Kurtosis: {:06.2f}'.format(numeric_train_data[col].kurt())  
         )

"""每個數字特徵得分佈可視化"""
f = pd.melt(train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=5, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")

數值特徵的分佈可視化,從這裏可以看到數值特徵的分佈情況。可以看出匿名特徵相對分佈均勻
在這裏插入圖片描述

"""數字特徵相互之間的關係可視化"""
sns.set()
columns = ['price', 'v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
sns.pairplot(train_data[columns],size = 2 ,kind ='scatter',diag_kind='kde')
plt.show()

看下結果:
在這裏插入圖片描述
這裏面會看到有些特徵之間是相關的, 比如v_1和v_6

"""多變量之間的關係可視化"""
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2, figsize=(24, 20))
# ['v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
v_12_scatter_plot = pd.concat([Y_train,train_data['v_12']],axis = 1)
sns.regplot(x='v_12',y = 'price', data = v_12_scatter_plot,scatter= True, fit_reg=True, ax=ax1)

v_8_scatter_plot = pd.concat([Y_train,train_data['v_8']],axis = 1)
sns.regplot(x='v_8',y = 'price',data = v_8_scatter_plot,scatter= True, fit_reg=True, ax=ax2)

v_0_scatter_plot = pd.concat([Y_train,train_data['v_0']],axis = 1)
sns.regplot(x='v_0',y = 'price',data = v_0_scatter_plot,scatter= True, fit_reg=True, ax=ax3)

power_scatter_plot = pd.concat([Y_train,train_data['power']],axis = 1)
sns.regplot(x='power',y = 'price',data = power_scatter_plot,scatter= True, fit_reg=True, ax=ax4)

v_5_scatter_plot = pd.concat([Y_train,train_data['v_5']],axis = 1)
sns.regplot(x='v_5',y = 'price',data = v_5_scatter_plot,scatter= True, fit_reg=True, ax=ax5)

v_2_scatter_plot = pd.concat([Y_train,train_data['v_2']],axis = 1)
sns.regplot(x='v_2',y = 'price',data = v_2_scatter_plot,scatter= True, fit_reg=True, ax=ax6)

v_6_scatter_plot = pd.concat([Y_train,train_data['v_6']],axis = 1)
sns.regplot(x='v_6',y = 'price',data = v_6_scatter_plot,scatter= True, fit_reg=True, ax=ax7)

v_1_scatter_plot = pd.concat([Y_train,train_data['v_1']],axis = 1)
sns.regplot(x='v_1',y = 'price',data = v_1_scatter_plot,scatter= True, fit_reg=True, ax=ax8)

v_14_scatter_plot = pd.concat([Y_train,train_data['v_14']],axis = 1)
sns.regplot(x='v_14',y = 'price',data = v_14_scatter_plot,scatter= True, fit_reg=True, ax=ax9)

v_13_scatter_plot = pd.concat([Y_train,train_data['v_13']],axis = 1)
sns.regplot(x='v_13',y = 'price',data = v_13_scatter_plot,scatter= True, fit_reg=True, ax=ax10)

看下結果:
在這裏插入圖片描述
關於可視化的更多學習,可以參考:https://www.jianshu.com/p/6e18d21a4cad

5. 數據知命

這裏會綜合上面的這些過程,用pandas_profiling這個包使用函數ProfileReport生成一份數據探索性報告, 在這裏面會看到:

  • 總體的數據信息(首先是數據集信息:變量數(列)、觀察數(行)、數據缺失率、內存;數據類型的分佈情況),
  • 警告信息
    • 要點:類型,唯一值,缺失值
    • 分位數統計量,如最小值,Q1,中位數,Q3,最大值,範圍,四分位數範圍
    • 描述性統計數據,如均值,模式,標準差,總和,中位數絕對偏差,變異係數,峯度,偏度
  • 單變量描述(對每一個變量進行描述)
  • 相關性分析(皮爾遜係數和斯皮爾曼係數)
  • 採樣查看等
# 兩行簡單的代碼即可搞定上面的這些信息
pfr = ppf.ProfileReport(train_data)
pfr.to_file("./EDA.html")

這個結果沒法全放在這裏,簡單的看下輪廓:
在這裏插入圖片描述
會有數據的總信息,警告信息(通過這些警告信息可以看到相關,缺失,偏斜等情況), 後面會是各個字段的統計說明信息,相關性信息,缺失值信息等都概況了。

6. 總結

今天通過圍繞着二手車價格預測的比賽,從五個維度整理了一下數據探索性分析的相關知識,下面我們根據思維導圖進行回顧一下:
在這裏插入圖片描述
這些探索性分析的技巧當然不只是限於這個比賽,從數據挖掘的角度來講,這些技巧可以遷移到其他的數據挖掘任務中,思路還是相通的,所以這裏才藉助這個機會在這裏做一個總結,後面也會給出關於探索性分析這塊之前學習過的知識鏈接,做一個知識的整合。或許上面寫的這些可視化技巧有些雜亂,或許有些在這個比賽裏面並不一定需要用到,但是我們學習的不僅是這個比賽,更重要的應該是數據挖掘的技巧和思想,所以這篇文章與其說針對這個比賽,不如說是針對數據挖掘,更想當做一份資料來查閱。

對了,通過數據的探索性分析之後,我們可以發現一些類別偏斜的特徵列,可以刪除掉,然後通過分析預測值的分佈,也會發現把預測值轉成log的形式要好些,從原來baseline的基礎上修改一下,成績會提高一點, 上次是658.5030, 這次是657.2422。當然,看到這個成績發現沒有提高的這麼明顯,哈哈,心裏有點失望吧, 但是別忘了,我們基本上沒有改啥東西啊,能有點提高就很不錯了,不過我們已經更加熟悉了我們的數據,接下來會是數據清洗和特徵工程部分,這纔是提高成績的關鍵所在,後面這兩塊我會分開進行描述,放一塊可能有點多。 敬請期待吧 😉

下面依然是技巧總結(依然來自Datawhale團隊車哥的總結):

所給出的EDA步驟爲廣爲普遍的步驟,在實際的不管是工程還是比賽過程中,這只是最開始的一步,也是最基本 的一步。

接下來一般要結合模型的效果以及特徵工程等來分析數據的實際建模情況,根據自己的一些理解,查閱文獻,對實際問題做出判斷和深入的理解。

最後不斷進行EDA與數據處理和挖掘,來到達更好的數據結構和分佈以及較爲強勢相關的特徵

數據探索有利於我們發現數據的一些特性, 數據之間的關聯性,對後續的特徵構建還是很有幫助的。

  1. 對於數據的初步分析:(直接查看數據,或.sum(), .mean(),.descirbe()等統計函數)可以從:樣本數量,訓練集數量,是否有時間特徵,是否是時許問題,特徵所表示的含義(非匿名特徵),特徵類型(字符類似, int,float,time),特徵的缺失情況(注意缺失的在數據中的表現形式,有些是空的有些是”NAN”符號 等),特徵的均值方差情況。
  2. 分析記錄某些特徵值缺失佔比30%以上樣本的缺失處理,有助於後續的模型驗證和調節,分析特徵應該是填充(填充方式是什麼,均值填充,0填充,衆數填充等),還是捨去,還是先做樣本分類用不同的特徵模型去預測。
  3. 對於異常值做專門的分析,分析特徵異常的label是否爲異常值(或者偏離均值較遠或者事特殊符號),異常值是否應該剔除,還是用正常值填充,是記錄異常,還是機器本身異常等。
  4. 對於Label做專門的分析,分析標籤的分佈情況等。
  5. 進一步分析可以通過對特徵作圖,特徵和label聯合做圖(統計圖,離散圖),直觀瞭解特徵的分佈情況,通過這一步也可以發現數據之中的一些異常值等,通過箱型圖分析一些特徵值的偏離情況,對於特徵和特徵聯合作圖,對於特徵和label聯合作圖,分析其中的一些關聯性。

還有一些tricks穿插在了上面的部分中,也是一些不錯的tricks喲!

對了, 你知道嗎?

在這裏插入圖片描述

參考

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

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