分別利用xgbboost和catboost演算法做特徵重要性排序
分別利用xgbboost和catboost演算法做特徵重要性排序
xgbboost
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.model_selection import train_test_split
import xgboost as xgb
from matplotlib import pyplot as plt
from sklearn.metrics import confusion_matrix
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.family']='Microsoft YaHei' #顯示中文標籤
plt.style.use ('ggplot') #設定繪圖風格
import seaborn as sns
df = pd.read_csv('***.csv')
df = df.fillna(0)
df.drop(['distinct_id'],axis=1,inplace=True)
df.rename(columns={'is_stay':'是否留存','max(is_login)':'是否登入','start_numbers':'啟動次數','is_play':'是否播放視訊','is_action':'是否評論/收藏/點贊/分享','show_numbers':'視訊曝光數','video_play_numbers':'視訊播放數','real_video_play_numbers':'視訊有效播放數','video_play_time':'視訊播放總時長','video_play_rate':'視訊播放率','video_real_play_rate':'視訊有效播放率','play_time_per_play':'每播放播放時長','play_time_per_show':'每曝光播放時長'},inplace=True)
X = df.drop(['是否留存'],axis=1)
y = df['是否留存']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
xgb_model = xgb.XGBClassifier(learning_rate = 0.1,max_depth = 7,min_child_weight = 5,objective = 'binary:logistic',seed = 0,gamma = 0.1,random_state=0,silent = True)
xgb_model.fit(X_train,y_train)
y_pred = xgb_model.predict(X_test)
cm = confusion_matrix(y_test,y_pred)
fig, ax= plt.subplots(figsize=(10,10))
cmap=sns.cubehelix_palette(start=1.5,rot=3,gamma=0.8,as_cmap=True)
sns.heatmap(cm,annot=True,fmt='g',cmap=cmap,linewidths=1.5,annot_kws={'size':20,'weight':'bold', 'color':'red'})
ax.set_xlabel('Predicted labels')
ax.set_ylabel('True labels')
ax.set_title('Confusion Matrix')
plt.setp(ax.get_yticklabels() , rotation = 360)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
ax.xaxis.set_ticklabels(['未流失', '流失'])
ax.yaxis.set_ticklabels(['未流失', '流失'])
plt.show()
fig,ax = plt.subplots(figsize=(16,9))
xgb.plot_importance(xgb_model,height=0.5,importance_type='gain',xlabel='xgbboost演算法計算出的留存相關特徵重要性',grid=False,ax=ax)
xgb.to_graphviz(xgb_model,num_trees=1,yes_color='#638e5e',no_color='#a40000')
結果展示
catboost
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
from sklearn.metrics import confusion_matrix
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.family']='Microsoft YaHei' #顯示中文標籤
plt.style.use ('ggplot') #設定繪圖風格
import seaborn as sns
from catboost import CatBoostClassifier
import numpy as np
df = pd.read_csv('***.csv')
df = df.fillna(0)
df.drop(['distinct_id'],axis=1,inplace=True)
df.rename(columns={'is_stay':'是否留存','max(is_login)':'是否登入','start_numbers':'啟動次數','is_play':'是否播放視訊','is_action':'是否評論/收藏/點贊/分享','show_numbers':'視訊曝光數','video_play_numbers':'視訊播放數','real_video_play_numbers':'視訊有效播放數','video_play_time':'視訊播放總時長','video_play_rate':'視訊播放率','video_real_play_rate':'視訊有效播放率','play_time_per_play':'每播放播放時長','play_time_per_show':'每曝光播放時長'},inplace=True)
X = df.drop(['是否留存'],axis=1)
y = df['是否留存']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
categorical_features_indices = np.where(X_train.dtypes != np.float)[0]
cat_model = CatBoostClassifier(iterations=100, depth=7,cat_features=categorical_features_indices,learning_rate=0.01, loss_function='Logloss',logging_level='Verbose')
cat_model.fit(X_train,y_train,plot=True)
y_pred = cat_model.predict(X_test)
cm = confusion_matrix(y_test,y_pred)
fig, ax= plt.subplots(figsize=(10,10))
cmap=sns.cubehelix_palette(start=1.5,rot=3,gamma=0.8,as_cmap=True)
sns.heatmap(cm,annot=True,fmt='g',cmap=cmap,linewidths=1.5,annot_kws={'size':20,'weight':'bold', 'color':'red'})
ax.set_xlabel('Predicted labels')
ax.set_ylabel('True labels')
ax.set_title('Confusion Matrix')
plt.setp(ax.get_yticklabels() , rotation = 360)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
ax.xaxis.set_ticklabels(['未流失', '流失'])
ax.yaxis.set_ticklabels(['未流失', '流失'])
plt.show()
fea_ = cat_model.feature_importances_
fea_name = cat_model.feature_names_
plt.figure(figsize=(16, 9))
plt.title('catboost演算法計算出的與留存相關特徵重要性')
plt.barh(fea_name,fea_,height =0.5)
結果展示
實際第二種結果更符合當前業務邏輯,區別最大的是二分類特徵,具體邏輯還待進一步思考
相關文章
- 使用XGboost模組XGBClassifier、plot_importance來做特徵重要性排序Import特徵排序
- 用xgboost模型對特徵重要性進行排序模型特徵排序
- xgboost特徵重要性特徵
- 【演算法】關於xgboost特徵重要性的評估演算法特徵
- XGBoost 輸出特徵重要性以及篩選特徵特徵
- xgboost輸出特徵重要性排名和權重值特徵
- xgboost 特徵重要性計算特徵
- 前端和後端分別做什麼?前端後端
- Java利用Comparator實現分組排序Java排序
- 【特徵工程】(資料)使用Xgboost篩選特徵重要性特徵工程
- xgboost 特徵重要性選擇 / 看所有特徵哪個重要特徵
- 排序演算法:二分插入排序排序演算法
- 排序演算法之——二分插入排序演算法排序演算法
- 利用LSTM做語言情感分類
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- XGBoost學習(六):輸出特徵重要性以及篩選特徵特徵
- 特徵重要性評估的隨機森林演算法與Python實現(三)特徵隨機森林演算法Python
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- go slice/map型別 排序(選擇排序演算法)Go型別排序演算法
- 利用java實現插入排序、歸併排序、快排和堆排序Java排序
- 【趙強老師】利用Python完成資料分佈特徵的分析Python特徵
- 一組關鍵字序列,分別給出用希爾排序、直接選擇排序演算法從小到大排序結果排序演算法
- xgboost模型特徵重要性的不同計算方式模型特徵
- 用xgboost獲取特徵重要性及應用特徵
- Python演算法分為哪幾類?具備哪些特徵?Python演算法特徵
- 特徵工程 特徵選擇 reliefF演算法特徵工程演算法
- 演算法學習之選擇排序和堆排序:演算法排序
- 特徵值和特徵向量特徵
- 用xgboost獲取特徵重要性原理及實踐特徵
- 三分鐘看懂插入排序演算法排序演算法
- C++筆記 劃分與排序演算法C++筆記排序演算法
- Java實現氣泡排序和插入排序演算法Java排序演算法
- 利用opencv 做一個簡單的人臉識別OpenCV
- 資料結構和演算法(Golang實現)(25)排序演算法-快速排序資料結構演算法Golang排序
- PHP陣列多個欄位分別排序PHP陣列排序
- 特徵值 和 特徵向量,thrive特徵
- 特徵融合與特徵互動的區別特徵
- 【JAVA演算法】排序演算法 -- 快速排序Java演算法排序