數據挖掘入門:二手車交易價格預測

題目和數據來源於:阿里天池數據挖掘學習賽

備註:本篇文章主要目的是爲了通過阿里天池的入門教程,保存一下數據挖掘中的一般步驟,因此解釋性工作較少,主要是方便自己未來作爲參照使用。

其中下面的主要代碼參考了比賽中的Baseline方案!後續會補充一些相關知識點。

#Step1:導入函數工具箱

##基礎工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns 
from scipy.special import jn
from IPython.display import display,clear_output
import time

#忽略警告信息
warnings.filterwarnings('ignore')

##模型預測的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor

##數據降維處理的
from sklearn.decomposition import PCA,FastICA,FactorAnalysis,SparsePCA

import lightgbm as lgb
import xgboost as xgb

##參數搜索和評價的
from sklearn.model_selection import GridSearchCV,cross_val_score,StratifiedKFold,train_test_split
from sklearn.metrics import mean_squared_error,mean_absolute_error

#Step2:數據讀取

##通過pandas對於數據進行讀取
Train_data=pd.read_csv('used_car_train_20200313.csv',sep=' ')
TestB_data=pd.read_csv('used_car_testB_20200421.csv',sep=' ')

##輸出數據的大小信息
#print('Train data shape:',Train_data.shape)
#print('TestB data shape:',TestB_data.shape)

##通過.head()簡要瀏覽讀取數據的形式(默認前5行)
Train_data.head()

##通過.info()簡要可以看到對應一些數據列名以及NAN缺失信息
Train_data.info()

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

##通過.describe()可以查看數值特徵列的一些統計信息
Train_data.describe()

#Step3:特徵與標籤構建

#1)提取數值類型特徵列名
numerical_cols=Train_data.select_dtypes(exclude='object').columns
categorical_cols=Train_data.select_dtypes(include='object').columns

#2)構建訓練和測試樣本
##選擇特徵列
feature_cols=[col for col in numerical_cols if col not in ['SaleID','name','regDate','creatDate','price','model','brand','regionCode','seller']]
feature_cols=[col for col in feature_cols if 'Type' not in col]

##提取特徵列、標籤列構造訓練樣本和測試樣本
X_data=Train_data[feature_cols]
Y_data=Train_data['price']

X_test=TestB_data[feature_cols]

print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)

##定義了一個統計函數,方便後續信息統計
def Sta_inf(data):
    print('_min:',np.min(data))
    print('_max:',np.max(data))
    print('_mean:',np.mean(data))
    print('_ptp:',np.ptp(data)) #軸方向上的最大值與最小值之差
    print('_std:',np.std(data))
    print('_var:',np.var(data))

#3)統計標籤的基本分佈信息
print('Sta of label:')
Sta_inf(Y_data)

##繪製標籤的統計圖,查看標籤分佈
#plt.hist(Y_data)
#plt.show()
#plt.close()

#4)缺省值用-1填補
X_data=X_data.fillna(-1)
X_test=X_test.fillna(-1)

#Step4:模型訓練與預測

#1)利用xgb進行五折交叉驗證查看模型的參數效果
##xgb-Model
xgr=xgb.XGBRegressor(n_estimators=120,learning_rate=0.1,gamma=0,subsample=0.8,\
    colsample_bytree=0.9,max_depth=7) #,objective='reg:squarederror'

scores_train=[]
scores=[]

##5折交叉驗證方式
sk=StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
for train_ind,val_ind in sk.split(X_data,Y_data):
    train_x=X_data.iloc[train_ind].values
    train_y=Y_data.iloc[train_ind]
    val_x=X_data.iloc[val_ind].values
    val_y=Y_data.iloc[val_ind]

    xgr.fit(train_x,train_y)
    pred_train_xgb=xgr.predict(train_x)
    pred_xgb=xgr.predict(val_x)

    score_train=mean_absolute_error(train_y,pred_train_xgb)
    scores_train.append(score_train)
    score=mean_absolute_error(val_y,pred_xgb)
    scores.append(score)

print('Train mean:',np.mean(score_train))
print('Val mean:',np.mean(scores))

#2)定義xgb和lgb模型函數
def build_model_xgb(x_train,y_train):
    model=xgb.XGBRegressor(n_estimators=150,learning_rate=0.1,gamma=0,subsample=0.8,\
        colsample_bytree=0.9,max_depth=7) #,objective='reg:squarederror'
    model.fit(x_train,y_train)
    return model

def build_model_lgb(x_train,y_train):
    estimator=lgb.LGBMRegressor(num_leaves=127,n_estimators=150)
    param_grid={
        'learning_rate':[0.01, 0.05, 0.1, 0.2],
    } 
    gbm=GridSearchCV(estimator,param_grid)
    gbm.fit(x_train,y_train)
    return gbm

#3)切分數據集(Train,Val)進行模型訓練,評價和預測

##Split data with val
x_train,x_val,y_train,y_val=train_test_split(X_data,Y_data,test_size=0.3)
print('Train lgb...')
model_lgb=build_model_lgb(x_train,y_train)
val_lgb=model_lgb.predict(x_val)
MAE_lgb=mean_absolute_error(y_val,val_lgb)
print('MAE of val with lgb:',MAE_lgb)

print('Predict lgb...')
model_lgb_pre=build_model_lgb(X_data,Y_data)
subB_lgb=model_lgb_pre.predict(X_test)
print('Sta of Predict lgb:')
Sta_inf(subB_lgb)

print('Train xgb...')
model_xgb=build_model_xgb(x_train,y_train)
val_xgb=model_xgb.predict(x_val)
MAE_xgb=mean_absolute_error(y_val,val_xgb)
print('MAE of val with xgb:',MAE_xgb)

print('Predict xgb...')
model_xgb_pre=build_model_xgb(X_data,Y_data)
subB_xgb=model_xgb_pre.predict(X_test)
print('Sta of Predict xgb:')
Sta_inf(subB_xgb)

#4)進行兩模型的結果加權融合

##這裏我們採取了簡單的加權融合的方式
val_Weighted=(1-MAE_lgb/(MAE_lgb+MAE_xgb))*val_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*val_xgb
val_Weighted[val_Weighted<0]=10 #由於我們發現預測的最小值有負數,而真實情況下,price爲負是不存在的,由此我們進行對應的後修正
print('MAE of val with Weighted ensemble:',mean_absolute_error(y_val,val_Weighted))

sub_Weighted=(1-MAE_lgb/(MAE_lgb+MAE_xgb))*subB_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*subB_xgb

##查看預測值的統計進行
plt.hist(Y_data)
plt.show()
plt.close()

#5)輸出結果
sub=pd.DataFrame()
sub['ScaleID']=TestB_data.ScaleID
sub['price']=sub_Weighted
sub.to_csv('sub_weighted.csv',idnex=false)

sub.head()

 

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