基於Gradient Booting的自動化超參數優化的銷售預測----python數據分析與數據運營

本文基於python數據分析與數據化運營-第六章學習筆記,數據與大部分代碼均來源數據該書;

案例背景針對某單品的訂單量預測應用
數據介紹:731*10數據,有缺失及異常值,字段包括,是否有限購,促銷活動類型,促銷活動重要性,產品重要性分級,促銷資源位數量,電子郵件中包含該商品的比例,單品價格,折扣率,促銷活動展示的小時數,單品促銷費用,銷售數量;

import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor #集成方法GradientBoosting迴歸庫
from sklearn.model_selection import GridSearchCV  #對超參數進行網格搜索並配合交叉檢驗優化的庫
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error as mse #評估迴歸擬合程度

 

raw_data = pd.read_table(r"D:\data_analysis_and_data_operation_with_python\python_book_v2\chapter6\products_sales.txt",delimiter=",")
#查看各列數據的缺失情況,df.info在維度較少可以查看,但是維度過多,就不會顯示
def get_null_count(raw_data):
    columns_isnull = raw_data.isnull().any(axis=0)
    columns_isnull_count = []
    for name in list(raw_data.columns):
        if columns_isnull[name]==True:
            columns_isnull_count.append([name,sum(list(raw_data.isnull()[name]))])
    return columns_isnull_count
print(raw_data.head())
get_null_count(raw_data)

 ['price', 2]結果顯示:只有“price”字段有缺失值,使用平均值進行填充;

sales_data = raw_data.fillna(raw_data["price"].mean())
#使用describe(),查看各變量分佈情況,看是否存在異常值;若變量過多,可以自定義函數進行判斷,進行篩選
raw_data.describe()
#分割數據集X和y
num = int(sales_data.shape[0]*0.7)
X,y=sales_data.iloc[:,:-1],sales_data.iloc[:,-1]
X_train,X_test = X.iloc[0:num,:],X.iloc[num:,:]
y_train,y_test = y.iloc[0:num],y.iloc[num:]
#模型訓練
model_gbr = GradientBoostingRegressor()
parameters = {"loss":['ls','lad','huber','quantile'],'n_estimators':[10,50,100],'learning_rate':[0.05,0.1,0.15],'max_depth':[2,3,4,5],'min_samples_split':[2,3,5],'min_samples_leaf':[1,2,4]}
model_gs = GridSearchCV(estimator=model_gbr,param_grid=parameters,cv=3,n_jobs=-1)
model_gs.fit(X_train,y_train)
print("Best score is",model_gs.best_score_)
print("Best parameter is",model_gs.best_params_)

GridSearchCV:自動調參,只要把參數輸進去,就能給出最優化的結果和參數。但是這個方法適合於小數據集,一旦數據的量級上去了,很難得出結果。這個時候就是需要動腦筋了。數據量比較大的時候可以使用一個快速調優的方法——座標下降。它其實是一種貪心算法:拿當前對模型影響最大的參數調優,直到最優化;再拿下一個影響最大的參數調優,如此下去,直到所有的參數調整完畢。這個方法的缺點就是可能會調到局部最優而不是全局最優;

model_best = model_gs.best_estimator_ #獲得交叉檢驗模型得出的最優模型對象
#對模型進行測試,得到測試評分
pre_test = model_best.predict(X_test)
mse_score = mse(pre_test,y_test)
mse_score
#繪製預測結果與實際結果的對比圖
plt.style.use("ggplot")
plt.figure(figsize=(10,7))
plt.plot(np.arange(X_test.shape[0]),y_test,linestyle="-",color="k",label="true y")
plt.plot(np.arange(X_test.shape[0]),pre_test,linestyle=":",color="m",label="pre y")
plt.title("best model with mse of {}".format(int(mse_score)))
plt.legend(loc=0)

其他思考:

1、本案例自變量沒有進行標準化,是因爲本案例的算法基於CART的集成模型,量綱對結果本身沒有影響;

2、沒有進行特徵的選擇(共線性問題),該模型參數在某種程度上已經規避了該問題

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