包的安裝:
採用Anaconda 3進行代碼的編譯,Anaconda 3裏基礎的數據分析包都已經準備好,我們需要安裝的就是sklearn,lightgbm和xgboost包。
Anaconda可以支持我們採取多種方式安裝所需要的包。可以採用pip,conda和從PYPI下載相關包等方式。這裏採用的是pip方式。
pip install scikit-learn
pip install lightgbm
pip install xgboost
因爲之前一直在進行Arcpy的開發工作,因此我電腦裏裝配的是Anaconda 2 32位,這在安裝lightgbm和xgboost的過程中遇到了錯誤。因此又安裝了Anaconda 3 64位版本。同隊的韓哥也遇到了報錯的問題,似乎是因爲pip的版本不夠新,需要升級後再安裝。
數據加載與查看
首先我們需要將已有的數據讀進內存裏,
import pandas as pd
import numpy as np
import warnings
#爲了防止沒有維護的包彈警告,可以在這裏過濾掉警告
warnings.filterwarnings('ignore')
#在Jupyter裏,可能會對過多的列進行隱藏, 如果想要查看全部的列,可以設置max_columns
pd.set_option('display.max_columns', None)
train_df = pd.read_csv('D:/DataMining/Train Data/used_car_train_20200313.csv', sep=' ')
print(train_df.shape)
train_df.describe()
train_df.head()
下一步來求一下空值數量,看看各個變量空值缺失的狀況,如果缺失多,可以考慮在構建特證的時候剔除。
train_df.isnull().sum().sort_values(ascending=False).head()
接下來看一下價格的分佈
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure()
sns.distplot(train_df['price'])
plt.figure()
train_df['price'].plot.box()
plt.show()
再將測試集讀進來,看一下測試集的狀態。
import gc
test_df = pd.read_csv('datalab/231784/used_car_testA_20200313.csv', sep=' ')
print(test_df.shape)
df = pd.concat([train_df, test_df], axis=0, ignore_index=True)
del train_df, test_df
gc.collect()
df.head()
我們接下來可以看一下非匿名的幾個可能會比較相關的數據的分佈。
plt.figure()
plt.figure(figsize=(16, 6))
i = 1
for f in date_cols:
for col in ['year', 'month', 'day', 'dayofweek']:
plt.subplot(2, 4, i)
i += 1
v = df[f + '_' + col].value_counts()
fig = sns.barplot(x=v.index, y=v.values)
for item in fig.get_xticklabels():
item.set_rotation(90)
plt.title(f + '_' + col)
plt.tight_layout()
plt.show()
對數據進行初步的處理和加工
移除只有單個因素的特徵
cate_cols.remove('seller')
cate_cols.remove('offerType')
date_cols = ['regDate_year', 'regDate_month', 'regDate_day', 'regDate_dayofweek', 'creatDate_month', 'creatDate_day', 'creatDate_dayofweek']
下一步想要查看一下各個特徵和price的相關性,以及特徵和特徵之間的關係。這個圖表可以幫助我們理解哪些特徵可以被選入特徵向量的的構建,還有降維時要去除哪些特徵。
corr1 = abs(df[~df['price'].isnull()][['price'] + date_cols + num_cols].corr())
plt.figure(figsize=(10, 10))
sns.heatmap(corr1, linewidths=0.1, cmap=sns.cm.rocket_r)
跟price相關性高的是regDate_year、kilometer;匿名特徵中的v_0、v_3、v_8、v_12與price相關性很高。有些特徵跟特徵之間的相關性也很高,比如v_1跟v_6、v_2跟v_7、v_3跟v_8、v_4跟v_9等,這些特徵之間可能存在冗餘現象,訓練的時候可以依據效果嘗試去掉一部分。