數據探索在機器學習中一般被稱爲EDA(Exploratory Data Analysis),
對已有的數據,特別是調查或觀察得來的原始數據,在儘量少的先驗假定下進行探索,
通過作圖、製表、方程擬合、計算特徵量等手段探索數據的結構和規律的一種數據分析方法。
1. 載入相關庫
- 數據科學基礎工具庫, pandas、numpy、scipy
- 可視化庫,matplotlib、seabon
- 模型預測
- 數據降維處理
- 參數搜索和評價
missingno是“缺失值可視化處理”庫,方便我們直接觀察缺失值。
seaborn是一個可以理解成爲更爲簡便的matplotlib的庫
## 導入相關庫
## 基礎工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
from scipy.special import jn
from IPython.display import display, clear_output
import time
warnings.filterwarnings('ignore')
%matplotlib inline
#模型預測的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
import lightgbm as lgb
import xgboost as xgb
#數據降維處理
from sklearn.decomposition import PCA, FastICA, FactorAnalysis, SparsePCA
#參數搜索和評價的
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold, train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
2. 數據載入(pd.read_csv)
#通過Pandas對數據進行讀取
Train_data=pd.read_csv('used_car_train_20200313.csv', sep=' ')
TestA_data=pd.read_csv('used_car_testA_20200313.csv', sep=' ')
3. 數據總覽
3.1 查看數據維度
3.2 查看數據內容(head() & tail() )
主要查看數據的列名,以及每列的含義。此處使用head() 和 tail() 函數
-
訓練數據
訓練數據集共有共150000個樣本, 30列特徵(31列是30列特徵+1列標籤價格)。
31個數據列的屬性依次爲:- 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)
3.3 查看數據類型(info()函數)
使用info()函數查看數據類型
數據類型爲float64 的有20個, 數據類型爲 int64的有9個, 剩下1個object類(notRepairedDamage特徵)
3.4 查看數據分佈(describe()函數)
查看數據分佈使用describe()函數,關於數值列的統計量(對於非數值的列就無法統計了),個數count、平均值mean、方差std、最小值min、中位數25% 50% 75% 、以及最大值
看這個信息主要是瞬間掌握數據的大概的範圍以及每個值的異常值的判斷,比如有的時候會發現
9999999, -1 等值這些其實都是nan的另外一種表達方式,需要注意。
-
訓練數據
注意到有且僅有notRepairedDamage特徵的類型是object,因此上面describe得到的數據統計特徵裏沒有統計這個,所以最後describe得到的形狀是8x30而不是8x31。 -
測試數據
4. 判斷數據缺失和異常
4.1 存在nan以及nan可視化
4.1.1 查看每列的nan (X.isnull().sum())
存在缺失值的有四列,依次爲:
- model - 1個
- bodyType - 4506個
- fuelType - 8680個
- gearbox - 5981個
4.1.2 nan的可視化
共有四個特徵存在缺失值。如果nan的數量存在的很小一般選擇填充,如果使用lgb等樹模型可以直接空缺,讓樹自己去優化,但如果nan存在的過多、可以考慮刪掉。
4.2 非數值類型的異常值檢測
非數值類型的特徵數據需要額外考慮,因爲 如果非數值類型的數據值爲其它符號比如 ‘-’ ,有有些空值會用 ‘-’ 表示,X.isnull().sum()函數卻視爲非空值。
‘-’ 即爲缺失值,替換成nan
在之前的統計中,notRepairedDamage特徵是沒有統計到有空缺值的,在替換爲nan值以後再統計:
可見notRepairedDamage特徵的缺失值變爲了最多!
4.3 數值類型的異常值檢測(value_counts())
使用value_counts() 查看數值類型的特徵,是否存在嚴重傾斜的特徵,一般不會對預測有什麼幫助,可以先刪掉
刪除
4.4 查看所有特徵的偏度和峯度
-
查看所有特徵的偏度分佈情況
-
查看所有特徵的峯度分佈情況
5. 預測值的分佈情況
5.1 查看數值的總體分佈情況
## 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)
可以看到價格不服從正態分佈,因此在進行迴歸之前,它必須進行轉換。最佳擬合是約翰遜分佈。
5.2 查看price的skewness和kurtosis(偏度和峯度)
5.3 查看預測值的頻數
查看頻數, 大於20000得值極少,其實這裏也可以把這些當作特殊得值(異常值)直接用填充或者刪掉
5.4 log變換後的分佈
對價格進行log變換後,分佈會變得比較均勻
6. 特徵分析
6.1 特徵分類
把特徵分爲數字特徵和類別特徵
Y_train = Train_data['price']
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',]
6.2 類別特徵分析
利用nunique統計各特徵中不同的值的數量
- 訓練數據的nunique統計
- 測試數據的nunique統計
6.3 數字特徵分析
6.3.1 特徵之間的相關性分析
使用熱力圖表示
顏色越淡,說明相關性越高
6.3.2 查看幾個數值特徵的偏度和峯度
6.3.3 每個數字特徵的分佈可視化
## 3) 每個數字特徵得分佈可視化
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")
6.3.4 數字特徵相互之間的關係可視化
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()
6.3.5 多變量互相迴歸關係可視化
#多變量互相迴歸關係可視化
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)
7. 生成數據報告(pandas_profiling)
用pandas_profiling生成一個較爲全面的可視化和數據報告,最終打開html文件