基於AdaBoost的營銷響應預測
項目背景
此次項目主要針對會員營銷進行預測。會員部門在做會員營銷時,希望通過數據預測在下一次營銷活動時,響應活動會員的具體名單和響應概率,以此來制定相應的營銷策略。
涉及的技術:重點應用通過管道方法將多個數據處理環節結合起來,形成處理管道對象,然後針對該對象做交叉檢驗,並得到不同參數下的檢驗結果,輔助於參數值設置。
數據集
Sheet1為訓練集,sheet2為預測集。
特徵變數數13個。
Age:年齡,整形
Total_pageviews: 總頁面瀏覽量,整形變數。Edu:教育程度,分類型變數,值域 [1,10]
Edu_ages:受教育年限,整形變數
User_level: 用戶等級,分類型變數,值域[1,7]
Industry:用戶行業劃分,分類型變數,值域[1,15]
Value_level:用戶價值度分類,分類型變數,值域[1,6]
Act_level:用戶活躍度分類,分類變數,值域[1,5]
Sex:性別,值域0,1
Blue_money:歷史訂單的藍券用券訂單金額(優惠券的一種),整形變數,與之對應的是紅券(Red_money)
Work_hours:工作時間長度,整形變數
Region:地區,分類型變數,值域[1,41]
目標變數response,1代表用戶有響應,0代表未響應。
訓練集記錄數39999,預測集記錄數8843。
下面是代碼部分:
import time import numpy as np import pandas as pd from sklearn.preprocessing import OneHotEncoder # 導入OneHotEncoder庫from sklearn.model_selection import StratifiedKFold, cross_val_score # 導入交叉檢驗演算法from sklearn.feature_selection import SelectPercentile, f_classif # 導入特徵選擇方法庫from sklearn.ensemble import AdaBoostClassifier # 導入集成演算法from sklearn.pipeline import Pipeline # 導入Pipeline庫from sklearn.metrics import accuracy_score # 計算準確率指標raw_data = pd.read_excel(E:/數據集/order.xlsx,sheetname=0)raw_data.info()RangeIndex: 39999 entries, 0 to 39998Data columns (total 14 columns):age 39998 non-null float64total_pageviews 39998 non-null float64edu 39998 non-null float64edu_ages 39998 non-null float64user_level 39998 non-null float64industry 39997 non-null float64value_level 39999 non-null int64act_level 39998 non-null float64sex 39998 non-null float64blue_money 39999 non-null int64red_money 39998 non-null float64work_hours 39999 non-null int64region 39997 non-null float64response 39999 non-null int64dtypes: float64(10), int64(4)memory usage: 4.3 MB# 基本狀態查看def set_summary(df): 查看數據集的記錄數、維度數、前2條數據、描述性統計和數據類型 :param df: 數據框 :return: 無 print (Data Overview) print (Records: {0} Dimension{1}.format(df.shape[0], (df.shape[1] - 1))) # 列印數據集X形狀 print (- * 30) print (df.head(2)) # 列印前2條數據 print (- * 30) print (Data DESC) print (df.describe()) # 列印數據基本描述性信息 print (Data Dtypes) print (df.dtypes) # 列印數據類型 print (- * 60)# 缺失值審查def na_summary(df): 查看數據集的缺失數據列、行記錄數 :param df: 數據框 :return: 無 na_cols = df.isnull().any(axis=0) # 每一列是否具有缺失值 print (NA Cols:) print (na_cols) # 查看具有缺失值的列 print (- * 30) print (valid records for each Cols:) print (df.count()) # 查看每一列有效值(非NA)的記錄數 print (- * 30) na_lines = df.isnull().any(axis=1) # 查看每一行是否具有缺失值 print (Total number of NA lines is: {0}.format(na_lines.sum())) # 查看具有缺失值的行總記錄數 print (- * 30)# 類樣本均衡審查#如果樣本分布不均衡則需要做樣本均衡處理def label_summary(df): 查看每個類的樣本量分布 :param df: 數據框 :return: 無 print (Labesl samples count:) print (df[value_level].groupby(df[response]).count()) # 以response為分類匯總維度對value_level列計數統計 print (- * 60)# 數據預處理# 變數類型轉換def type_con(df): 轉換目標列的數據為特定數據類型 :param df: 數據框 :return: 類型轉換後的數據框 var_list = {edu: int32, user_level: int32, industry: int32, value_level: int32, act_level: int32, sex: int32, region: int32 } # 字典:定義要轉換的列及其數據類型 for var, type in var_list.items(): # 循環讀出列名和對應的數據類型 df[var] = df[var].astype(type) # 數據類型轉換 print (Data Dtypes) print (df.dtypes) # 列印數據類型 print (- * 30) return df# NA值替換def na_replace(df): 將數據集中的NA值使用自定義方法替換 :param df: 數據框 :return: NA值替換後的數據框 na_rules = {age: df[age].mean(), total_pageviews: df[total_pageviews].mean(), edu: df[edu].median(), edu_ages: df[edu_ages].median(), user_level: df[user_level].median(), industry: df[user_level].median(), act_level: df[act_level].median(), sex: df[sex].median(), red_money: df[red_money].mean(), region: df[region].median() } # 字典:定義各個列數據轉換方法 df = df.fillna(na_rules) # 使用指定方法填充缺失值 print (Check NA exists:) print (df.isnull().any().sum()) # 查找是否還有缺失值 print (- * 30) return df# 標誌轉換def symbol_con(df, enc_object=None, train=True): 將分類和順序變數轉換為二值化的標誌變數 :param df: 數據框 :param enc_object: sklearn的標誌轉換對象,訓練階段設置默認值為None;預測階段使用從訓練階段獲得的轉換對象 :param train: 是否為訓練階段的判斷狀態,訓練階段為True,預測階段為False :return: 標誌轉換後的數據框、標誌轉換對象(如果是訓練階段) convert_cols = [edu, user_level, industry, value_level, act_level, sex, region] # 選擇要做標誌轉換的列名 df_con = df[convert_cols] # 選擇要做標誌轉換的數據 df_org = df[[age, total_pageviews, edu_ages, blue_money, red_money, work_hours]].values # 設置不作標誌轉換的列 if train == True: # 如果處於訓練階段 enc = OneHotEncoder() # 建立標誌轉換模型對象 enc.fit(df_con) # 訓練模型 df_con_new = enc.transform(df_con).toarray() # 轉換數據並輸出為數組格式 new_matrix = np.hstack((df_con_new, df_org)) # 將未轉換的數據與轉換後的數據合併 return new_matrix, enc else: df_con_new = enc_object.transform(df_con).toarray() # 使用訓練階段獲得的轉換對象轉換數據並輸出為數組格式 new_matrix = np.hstack((df_con_new, df_org)) # 將未轉換的數據與轉換後的數據合併 return new_matrix# 獲得最佳模型參數def get_best_model(X, y): 在該函數實現過程中,先要做數據降維,目的是降低數據計算量。 這裡使用selectPercentile方法結合f_classif評估選擇特徵明顯的50%數量的特徵。 selectPercentile方法用來按照指定方法選擇特定數量或比例的特徵變數,f_classif是計算數據集的方差P值方法。 這兩種方法結合起來後形成的transform模型對象,該對象目前沒有做任何操作,只是一個空對象而已。 結合交叉檢驗得到不同參數下的分類模型結果 :param X: 輸入X(特徵變數) :param y: 預測y(目標變數) :return: 特徵選擇模型對象 transform = SelectPercentile(f_classif, percentile=50) # 使用f_classif方法選擇特徵最明顯的50%數量的特徵 model_adaboost = AdaBoostClassifier() # 建立AdaBoostClassifier模型對象 model_pipe = Pipeline(steps=[(ANOVA, transform), (model_adaboost, model_adaboost)]) # 建立由特徵選擇和分類模型構成的「管道」對象 cv = StratifiedKFold(5) # 設置交叉檢驗次數 n_estimators = [20, 50, 80, 100] # 設置模型參數列表 score_methods = [accuracy, f1, precision, recall, roc_auc] # 設置交叉檢驗指標 mean_list = list() # 建立空列表用於存放不同參數方法、交叉檢驗評估指標的均值列表 std_list = list() # 建立空列表用於存放不同參數方法、交叉檢驗評估指標的標準差列表 for parameter in n_estimators: # 循環讀出每個參數值 t1 = time.time() # 記錄訓練開始的時間 score_list = list() # 建立空列表用於存放不同交叉檢驗下各個評估指標的詳細數據 print (set parameters: %s % parameter) # 列印當前模型使用的參數 for score_method in score_methods: # 循環讀出每個交叉檢驗指標 model_pipe.set_params(model_adaboost__n_estimators=parameter) # 通過「管道」設置分類模型參數 score_tmp = cross_val_score(model_pipe, X, y, scoring=score_method, cv=cv) # 使用交叉檢驗計算指定指標的得分 score_list.append(score_tmp) # 將交叉檢驗得分存儲到列表 score_matrix = pd.DataFrame(np.array(score_list), index=score_methods) # 將交叉檢驗詳細數據轉換為矩陣 score_mean = score_matrix.mean(axis=1).rename(mean) # 計算每個評估指標的均值 score_std = score_matrix.std(axis=1).rename(std) # 計算每個評估指標的標準差 score_pd = pd.concat([score_matrix, score_mean, score_std], axis=1) # 將原始詳細數據和均值、標準差合併 mean_list.append(score_mean) # 將每個參數得到的各指標均值追加到列表 std_list.append(score_std) # 將每個參數得到的各指標標準差追加到列表 print (score_pd.round(2)) # 列印每個參數得到的交叉檢驗指標數據,只保留2位小數 print (- * 60) t2 = time.time() # 計算每個參數下演算法用時 tt = t2 - t1 # 計算時間間隔 print (time: %s % str(tt)) # 列印時間間隔 mean_matrix = np.array(mean_list).T # 建立所有參數得到的交叉檢驗的均值矩陣 std_matrix = np.array(std_list).T # 建立所有參數得到的交叉檢驗的標準差矩陣 mean_pd = pd.DataFrame(mean_matrix, index=score_methods, columns=n_estimators) # 將均值矩陣轉換為數據框 std_pd = pd.DataFrame(std_matrix, index=score_methods, columns=n_estimators) # 將均值標準差轉換為數據框 print (Mean values for each parameter:) print (mean_pd) # 列印輸出均值矩陣 print (Std values for each parameter:) print (std_pd) # 列印輸出標準差矩陣 print (- * 60) return transform
Adaboost是針對同一個訓練集訓練不同的分類器,然後把(弱)分類器集合起來,構成一個強分類器。Sklearn提供兩類集成演算法。集成演算法相對於單個演算法的優勢是準確率高,魯棒性強。接著使用Pipline方法建立一個「管道」,目的是將特徵選擇和分類演算法合併起來做交叉檢驗。
使用sklearn中的Pipline是一個複合評估器,在數據處理和計演算法過程中,經常會用到數據標準化、數據轉換、特徵降維等方法,然後再對處理後的數據集做模型訓練和評估,這個過程可以使用Pipline形成具有序列步驟的組合評估器。
Pipline只有一個參數「steps」,該參數是一個由名稱和模型對象組成的元組和列表。這在這個列表中,不同的元組之間是明確的有先後的關係,並且最後一個元組一定是一個評估演算法。
當使用Pipe組合對象時,可應用的方法包括fit. Predict. Fit_predict. Fit_transform等。當對其使用predict(以及包含predict的其他方法,例如predict_proba、fit_predict等)會自動調用最後一個評估演算法的predict方法做預測。
Pipline(steps)方法本身是用來為交叉檢驗提供演算法對象不同參數下的效果,進而得到最優模型效果的方法。
使用StratifiedKFold方法設置5次交叉檢驗使用的訓練集和測試集;n_estimators是Adaboost的n_estimators參數用到的值列表,Score_methods是交叉檢驗指標列表,然後分別建立mean_list和std_list用於存放不同的參數方法、交叉檢驗評估指標的均值和標準差。
接下來進入到循環階段。這裡的訓練包括2層邏輯,外層邏輯是按照不同的n_estimator參數值做演算法交叉檢驗,內層邏輯是按照不同的交叉檢驗指標做交叉檢驗。
外層循環中,使用for遍歷遍歷每個n_estimators參數,使用t1記錄一個該參數下開始的時間戳,用來記錄不同參數對應的演算法運行時間;然後定義一個score_list空列表,用於記錄每次n_estimators參數下的演算法交叉檢驗結果。
內層循環中,使用for循環遍歷score_methods中的每個交叉檢驗得分估計方法,設置組合模型器(管道)對象model_pipe的參數,通過步驟名稱+_ _(兩個下劃線)+ 參數對象的方法設置,這裡的步驟名稱是在將建立管道是定義的字元串名稱,_(兩個下劃線用來表示連接對應步驟對象的參數),後面接具體參數的名稱,例如model_adaboost__n_estimators = parameter的意思是設置model_adaboost的n_estimators參數的值為parameter(parameter為從外層循環讀取的值)。接著使用cross_val_score方法建立交叉檢驗過程,分別設置模型對象為管道,數據集X和y以及交叉檢驗方法評分方法和交叉檢驗方法cv。最後將得到的結果使用append追加到score_list列表,獲得每個參數下的評估結果。
在內層循環結束後,將每個參數下交叉檢驗詳細數據轉換為矩陣score_matrix,目的是便於接下來基於不同的交叉檢驗指標計算均值和標準差,並格式化為pandas數據框做輸出。然後分別基於score_matrix的行(每行代表一個指標,每列代表一個交叉檢驗結果)計算均值和標準差。接著使用Pandas對象合併。接著使用pandas的concat方法做pandas對象合併,得到一個包含原始詳細交叉檢驗指標數據和均值、標準差的總體數據集。最後,將每個參數下的均值和標準差數據使用append方法追加到mean_list和std_list,便於評估不同參數的效果;使用round方法列印輸出保留兩位小數的數據框,並得到最後時間戳並輸出時間間隔
註:交叉檢驗的幾個指標具有非常高的相關性,相關係數超過0.99。因此實際應用當中選擇其中一個使用即可。
X = raw_data.drop(response, axis=1) # 分割Xy = raw_data[response] # 分割y# 數據審查和預處理set_summary(raw_data) # 基本狀態查看na_summary(raw_data) # 缺失值審查label_summary(raw_data) # 類樣本均衡均衡審查X_t1 = na_replace(X) # 替換缺失值X_t2 = type_con(X_t1) # 數據類型轉換X_new, enc = symbol_con(X_t2, enc_object=None, train=True) # 將分類和順序數據轉換為標誌
Data OverviewRecords: 39999 Dimension13------------------------------ age total_pageviews edu edu_ages user_level industry value_level 39.0 77516.0 1.0 13.0 1.0 1.0 1 1 50.0 83311.0 1.0 13.0 2.0 2.0 2 act_level sex blue_money red_money work_hours region response 0 1.0 1.0 2174 0.0 40 1.0 0 1 1.0 1.0 0 0.0 13 1.0 0 ------------------------------Data DESC age total_pageviews edu edu_ages count 39998.000000 3.999800e+04 39998.000000 39998.000000 mean 38.589654 1.895136e+05 2.511626 10.076754 std 13.663490 1.053109e+05 1.638110 2.573384 min 17.000000 1.228500e+04 1.000000 1.000000 25% 28.000000 1.175282e+05 2.000000 9.000000 50% 37.000000 1.783410e+05 2.000000 10.000000 75% 48.000000 2.372685e+05 2.000000 12.000000 max 90.000000 1.484705e+06 10.000000 16.000000 user_level industry value_level act_level sex count 39998.000000 39997.000000 39999.000000 39998.000000 39998.000000 mean 2.087004 5.677126 2.546289 1.221036 0.668083 std 1.260992 3.395948 1.443210 0.626618 0.470907 min 1.000000 1.000000 1.000000 1.000000 0.000000 25% 1.000000 3.000000 1.000000 1.000000 0.000000 50% 2.000000 5.000000 2.000000 1.000000 1.000000 75% 2.000000 8.000000 4.000000 1.000000 1.000000 max 7.000000 15.000000 6.000000 5.000000 1.000000 blue_money red_money work_hours region response count 39999.000000 39998.000000 39999.000000 39997.000000 39999.000000 mean 1089.142529 87.379394 40.442486 2.251519 0.239606 std 7491.275548 402.930350 12.376033 4.913482 0.426848 min 0.000000 0.000000 1.000000 1.000000 0.000000 25% 0.000000 0.000000 40.000000 1.000000 0.000000 50% 0.000000 0.000000 40.000000 1.000000 0.000000 75% 0.000000 0.000000 45.000000 1.000000 0.000000 max 99999.000000 4356.000000 99.000000 41.000000 1.000000 Data Dtypesage float64total_pageviews float64edu float64edu_ages float64user_level float64industry float64value_level int64act_level float64sex float64blue_money int64red_money float64work_hours int64region float64response int64dtype: object------------------------------------------------------------NA Cols:age Truetotal_pageviews Trueedu Trueedu_ages Trueuser_level Trueindustry Truevalue_level Falseact_level Truesex Trueblue_money Falsered_money Truework_hours Falseregion Trueresponse Falsedtype: bool------------------------------valid records for each Cols:age 39998total_pageviews 39998edu 39998edu_ages 39998user_level 39998industry 39997value_level 39999act_level 39998sex 39998blue_money 39999red_money 39998work_hours 39999region 39997response 39999dtype: int64------------------------------Total number of NA lines is: 12------------------------------Labesl samples count:response0 304151 9584Name: value_level, dtype: int64------------------------------------------------------------Check NA exists:0------------------------------Data Dtypesage float64total_pageviews float64edu int32edu_ages float64user_level int32industry int32value_level int32act_level int32sex int32blue_money int64red_money float64work_hours int64region int32dtype: object------------------------------
# 分類模型訓練transform = get_best_model(X_new, y) # 獲得最佳分類模型參數信息transform.fit(X_new, y) # 應用特徵選擇對象選擇要參與建模的特徵變數X_final = transform.transform(X_new) # 獲得具有顯著性特徵的特徵變數final_model = AdaBoostClassifier(n_estimators=100) # 從列印的參數均值和標準差信息中確定參數並建立分類模型對象當設置n_estimators=100時,意味著Adaboost會使用的最大單一評估模型(小模型)的數量為100個。 當模型結果已經足夠好時,將不會使用更多的模型器,因此當繼續加大該參數的數量時,可能會無法產生更好的結果。final_model.fit(X_final, y) # 訓練模型
set parameters: 20D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / msw 0 1 2 3 4 mean stdaccuracy 0.85 0.85 0.86 0.86 0.86 0.85 0.01f1 0.66 0.64 0.66 0.66 0.66 0.66 0.01precision 0.72 0.74 0.76 0.78 0.77 0.75 0.02recall 0.60 0.57 0.59 0.58 0.57 0.58 0.01roc_auc 0.91 0.90 0.91 0.91 0.91 0.91 0.00------------------------------------------------------------time: 31.840821266174316set parameters: 50D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / msw 0 1 2 3 4 mean stdaccuracy 0.86 0.86 0.86 0.87 0.86 0.86 0.00f1 0.66 0.66 0.67 0.69 0.68 0.67 0.01precision 0.75 0.76 0.77 0.78 0.77 0.76 0.01recall 0.59 0.58 0.59 0.62 0.61 0.60 0.02roc_auc 0.91 0.91 0.91 0.92 0.92 0.91 0.00------------------------------------------------------------time: 63.73264527320862set parameters: 80D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / msw 0 1 2 3 4 mean stdaccuracy 0.86 0.86 0.86 0.87 0.86 0.86 0.00f1 0.67 0.67 0.68 0.70 0.68 0.68 0.01precision 0.76 0.77 0.77 0.79 0.76 0.77 0.01recall 0.60 0.59 0.61 0.62 0.62 0.61 0.01roc_auc 0.92 0.92 0.92 0.92 0.92 0.92 0.00------------------------------------------------------------time: 100.31073760986328set parameters: 100D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / mswD:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:113: UserWarning: Features [85] are constant. UserWarning)D:Anaconda3libsite-packagessklearnfeature_selectionunivariate_selection.py:114: RuntimeWarning: invalid value encountered in true_divide f = msb / msw 0 1 2 3 4 mean stdaccuracy 0.86 0.86 0.87 0.87 0.86 0.86 0.00f1 0.67 0.67 0.69 0.70 0.69 0.68 0.01precision 0.76 0.77 0.78 0.79 0.76 0.77 0.01recall 0.60 0.60 0.61 0.63 0.62 0.61 0.01roc_auc 0.92 0.92 0.92 0.92 0.92 0.92 0.00------------------------------------------------------------time: 121.00592088699341Mean values for each parameter: 20 50 80 100accuracy 0.853946 0.859922 0.862647 0.863672f1 0.656329 0.672173 0.679723 0.682772precision 0.753126 0.764994 0.770094 0.771560recall 0.582011 0.599542 0.608411 0.612376roc_auc 0.908324 0.914994 0.918613 0.919941Std values for each parameter: 20 50 80 100accuracy 0.005260 0.004636 0.004463 0.004834f1 0.009512 0.012836 0.011527 0.011929precision 0.023295 0.010208 0.011250 0.012753recall 0.013767 0.016128 0.013591 0.013184roc_auc 0.003201 0.002865 0.002629 0.002652------------------------------------------------------------AdaBoostClassifier(algorithm=SAMME.R, base_estimator=None, learning_rate=1.0, n_estimators=100, random_state=None)# 新數據集做預測new_data = pd.read_excel(E:/數據集/order.xlsx, sheetname=1) # 讀取要預測的數據集final_reponse = new_data[final_response] # 獲取最終的目標變數值new_data = new_data.drop(final_response, axis=1) # 獲得預測的輸入變數Xset_summary(new_data) # 基本狀態查看na_summary(new_data) # 缺失值審查new_X_t1 = na_replace(new_data) # 替換缺失值new_X_t2 = type_con(new_X_t1) # 數據類型轉換new_X_t3 = symbol_con(new_X_t2, enc_object=enc, train=False) # 將分類和順序數據轉換為標誌new_X_final = transform.transform(new_X_t3) # 對數據集做特徵選擇Data OverviewRecords: 8843 Dimension12------------------------------ age total_pageviews edu edu_ages user_level industry value_level 61 243019 10 1 2.0 7.0 2 1 33 215596 4 5 2.0 7.0 2 act_level sex blue_money red_money work_hours region 0 1 1 0 0 40 1.0 1 5 1 0 0 40 6.0 ------------------------------Data DESC age total_pageviews edu edu_ages user_level count 8843.000000 8.843000e+03 8843.000000 8843.000000 8841.000000 mean 38.884428 1.903636e+05 2.492141 10.083795 2.070015 std 13.917154 1.069146e+05 1.603766 2.560132 1.241608 min 17.000000 1.349200e+04 1.000000 1.000000 1.000000 25% 28.000000 1.177010e+05 2.000000 9.000000 1.000000 50% 37.000000 1.775960e+05 2.000000 10.000000 2.000000 75% 48.000000 2.395390e+05 2.000000 12.000000 2.000000 max 90.000000 1.490400e+06 10.000000 16.000000 7.000000 industry value_level act_level sex blue_money count 8841.000000 8843.000000 8843.000000 8843.000000 8843.000000 mean 5.737699 2.504128 1.216669 0.670248 1033.496438 std 3.416071 1.425389 0.621275 0.470150 7272.047201 min 1.000000 1.000000 1.000000 0.000000 0.000000 25% 3.000000 1.000000 1.000000 0.000000 0.000000 50% 5.000000 2.000000 1.000000 1.000000 0.000000 75% 8.000000 4.000000 1.000000 1.000000 0.000000 max 15.000000 6.000000 5.000000 1.000000 99999.000000 red_money work_hours region count 8843.000000 8843.000000 8838.000000 mean 88.068190 40.331449 2.332541 std 403.384021 12.461211 5.156087 min 0.000000 1.000000 1.000000 25% 0.000000 40.000000 1.000000 50% 0.000000 40.000000 1.000000 75% 0.000000 45.000000 1.000000 max 3770.000000 99.000000 40.000000 Data Dtypesage int64total_pageviews int64edu int64edu_ages int64user_level float64industry float64value_level int64act_level int64sex int64blue_money int64red_money int64work_hours int64region float64dtype: object------------------------------------------------------------NA Cols:age Falsetotal_pageviews Falseedu Falseedu_ages Falseuser_level Trueindustry Truevalue_level Falseact_level Falsesex Falseblue_money Falsered_money Falsework_hours Falseregion Truedtype: bool------------------------------valid records for each Cols:age 8843total_pageviews 8843edu 8843edu_ages 8843user_level 8841industry 8841value_level 8843act_level 8843sex 8843blue_money 8843red_money 8843work_hours 8843region 8838dtype: int64------------------------------Total number of NA lines is: 7------------------------------Check NA exists:0------------------------------Data Dtypesage int64total_pageviews int64edu int32edu_ages int64user_level int32industry int32value_level int32act_level int32sex int32blue_money int64red_money int64work_hours int64region int32dtype: object------------------------------# 輸出預測值以及預測概率predict_labels = pd.DataFrame(final_model.predict(new_X_final), columns=[labels]) # 獲得預測標籤predict_labels_pro = pd.DataFrame(final_model.predict_proba(new_X_final), columns=[pro1, pro2]) # 獲得預測概率predict_pd = pd.concat((new_data, predict_labels, predict_labels_pro), axis=1) # 將預測標籤、預測數據和原始數據X合併print (Predict info)print (predict_pd.head(2)) # 列印前2條結果print (- * 60)Predict info age total_pageviews edu edu_ages user_level industry value_level 61 243019 10 1 2.0 7.0 2 1 33 215596 4 5 2.0 7.0 2 act_level sex blue_money red_money work_hours region labels 1 1 0 0 40 1.0 0 1 5 1 0 0 40 6.0 0 pro1 pro2 0 0.504053 0.495947 1 0.507486 0.492514 ------------------------------------------------------------
# 將預測結果寫入Excelwriter = pd.ExcelWriter(E:/數據集/order_predict_result.xlsx) # 創建寫入文件對象predict_pd.to_excel(writer, Sheet1) # 將數據寫入sheet1writer.save() # 保存文件print (final accuracy: {0}.format(accuracy_score(final_reponse, predict_labels)))final accuracy: 0.8624901051679295
最終的預測結果與真實的應用結果的需要對照著看。
註:經過多次測試,在最耗時的「獲得最佳模型參數」階段已經基本確認了最佳參數,無需每次運行,直接應用模型和最佳參數即可。
總體上,基於特徵數量(比例或絕對數量值)來選擇特徵的方法存在一定的風險性,主要原因是無法確定多少特徵為最佳數量。在這方面,使用PCA的方法的可靠性要好於特徵選擇方法,因此PCA這類方法可以基於解釋方差的比例選擇主成分的數量,而非固定主成分。
推薦閱讀:
※紙上得來終覺淺 絕知此事要躬行
※Python 數據分析學習路線
※當我們從事數據崗位時我們需要會什麼
※零基礎大數據學習路線
※另外一款編輯器 Geany
TAG:數據分析 |