DataFound 2019用戶畫像競賽分析

DataFound 2019用戶畫像競賽分析

1. 數(shù)據(jù)解釋

  • 列對應的中文
['用戶編碼', '用戶實名制是否通過核實', '用戶年齡', '是否大學生客戶', '是否黑名單客戶', '是否4G不健康客戶','用戶網(wǎng)齡(月)', '用戶最近一次繳費距今時長(月)', '繳費用戶最近一次繳費金額(元)', '用戶近6個月平均消費值(元)','用戶賬單當月總費用(元)', '用戶當月賬戶余額(元)', '繳費用戶當前是否欠費繳費', '用戶話費敏感度', '當月通話交往圈人數(shù)','是否經(jīng)常逛商場的人', '近三個月月均商場出現(xiàn)次數(shù)', '當月是否逛過福州倉山萬達', '當月是否到過福州山姆會員店', '當月是否看電影','當月是否景點游覽', '當月是否體育場館消費', '當月網(wǎng)購類應用使用次數(shù)', '當月物流快遞類應用使用次數(shù)','當月金融理財類應用使用總次數(shù)', '當月視頻播放類應用使用次數(shù)', '當月飛機類應用使用次數(shù)', '當月火車類應用使用次數(shù)','當月旅游資訊類應用使用次數(shù)', '信用分']
  • 列對應的英文
['uid','true_name_flag','age','uni_student_flag','blk_list_flag','4g_unhealth_flag','net_age_till_now','top_up_month_diff','top_up_amount','recent_6month_avg_use','total_account_fee','curr_month_balance','curr_overdue_flag','cost_sensitivity','connect_num','freq_shopping_flag','recent_3month_shopping_count','wanda_flag','sam_flag','movie_flag','tour_flag','sport_flag','online_shopping_count','express_count','finance_app_count','video_app_count','flight_count','train_count','tour_app_count','score']

2. 特征提取

  • 充值金額:
    • 整數(shù)和小數(shù)對應不同的充值渠道所计。比如說整數(shù)對應現(xiàn)金渠道席覆,小數(shù)對應在線支付。
  • 算充話費的穩(wěn)定性
    • 用戶賬單當月總費用(元) / 用戶近6個月平均消費值(元)
  • 當月話費使用率
    • 當月話費總額 / 當月剩余話費
  • 計算除用戶ID以外的所有的列的和
    • 整體考慮

3. 用到的求和函數(shù)

  • 計算各列數(shù)據(jù)總和并作為新列添加到末尾
df['col_sum'] = df.apply(lambda x: x.sum(), axis=1)
  • 計算各行數(shù)據(jù)總和并作為新行添加到末尾
df.loc['row_sum'] = df.apply(lambda x: x.sum())

4. 代碼實現(xiàn)

# 包導入

import time
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder

# 輸入數(shù)據(jù)
data_path = '../input/'
train_data = pd.read_csv(data_path + 'train_dataset.csv')
test_data = pd.read_csv(data_path + 'test_dataset.csv')
sample_sub = pd.read_csv(data_path + 'submit_example.csv')

# 預處理
train_data.head(1)
print(train_data.columns)

train_data.columns = ['uid','true_name_flag','age','uni_student_flag','blk_list_flag',\
                     '4g_unhealth_flag','net_age_till_now','top_up_month_diff','top_up_amount',\
                     'recent_6month_avg_use','total_account_fee','curr_month_balance',\
                     'curr_overdue_flag','cost_sensitivity','connect_num','freq_shopping_flag',\
                     'recent_3month_shopping_count','wanda_flag','sam_flag','movie_flag',\
                     'tour_flag','sport_flag','online_shopping_count','express_count',\
                     'finance_app_count','video_app_count','flight_count','train_count',\
                     'tour_app_count','score']
test_data.columns = train_data.columns[:-1]


# 特征提取
# top up amount, 充值金額是整數(shù),和小數(shù)火窒,應該對應不同的充值途徑零酪?

def produce_offline_feat(train_data):
    train_data['top_up_amount_offline'] = 0
    train_data['top_up_amount_offline'][(train_data['top_up_amount'] % 10 == 0) & train_data['top_up_amount'] != 0] = 1
    return train_data


train_data = produce_offline_feat(train_data)
test_data = produce_offline_feat(test_data)


def produce_fee_rate(train_data):
    # 看importance冒嫡,當月話費 和最近半年平均話費都很高,算一下當月/半年 -->穩(wěn)定性
    train_data['current_fee_stability'] = train_data['total_account_fee'] / (train_data['recent_6month_avg_use'] + 1)
    
    # 當月話費/當月賬戶余額
    train_data['use_left_rate'] = train_data['total_account_fee'] / (train_data['curr_month_balance'] + 1)
    return train_data


train_data = produce_fee_rate(train_data)
test_data = produce_fee_rate(test_data)


# 訓練
def display_importances(feature_importance_df_):
    cols = feature_importance_df_[["feature", "importance"]].groupby("feature").mean().sort_values(by="importance", ascending=False)[:40].index
    best_features = feature_importance_df_.loc[feature_importance_df_.feature.isin(cols)]
    plt.figure(figsize=(8, 10))
    sns.barplot(x="importance", y="feature", data=best_features.sort_values(by="importance", ascending=False))
    plt.title('LightGBM Features (avg over folds)')
    plt.tight_layout()
    plt.show()
    plt.savefig('feature_importance.jpg')

# para
params = {
    'learning_rate': 0.01,
    'boosting_type': 'gbdt',
    'objective': 'regression_l1',
    'metric': 'mae',
    'feature_fraction': 0.6,
    'bagging_fraction': 0.8,
    'bagging_freq': 2,
    'num_leaves': 31,
    'verbose': -1,
    'max_depth': 5,
    'lambda_l2': 5,
    'lambda_l1': 0,
    'nthread': 8
}

# para
params2 = {
    'learning_rate': 0.01,
    'boosting_type': 'gbdt',
    'objective': 'regression_l2',
    'metric': 'mae',
    'feature_fraction': 0.6,
    'bagging_fraction': 0.8,
    'bagging_freq': 2,
    'num_leaves': 31,
    'verbose': -1,
    'max_depth': 5,
    'lambda_l2': 5,
    'lambda_l1': 0,
    'nthread': 8,
    'seed': 89
}

cv_pred_all = 0
en_amount = 3
for seed in range(en_amount):
    NFOLDS = 5
    train_label = train_data['score']
    kfold = StratifiedKFold(n_splits=NFOLDS, shuffle=True, random_state=seed)
    kf = kfold.split(train_data, train_label)
    
    train_data_use = train_data.drop(['uid', 'score', 'blk_list_flag'], axis=1)
    test_data_use = test_data.drop(['uid', 'blk_list_flag'], axis=1)
    
    cv_pred = np.zeros(test_data.shape[0])
    valid_best_l2_all = 0
    
    feature_importance_df = pd.DataFrame()
    count = 0
    for i, (train_fold, validate) in enumerate(kf):
        print('fold: ', i, ' training')
        X_train, X_validate, label_train, label_validate = train_data_use.iloc[train_fold, :], train_data_use.iloc[validate, :], train_label[train_fold], train_label[validate]
        dtrain = lgb.Dataset(X_train, label_train)
        dvalid = lgb.Dataset(X_validate, label_validate, reference=dtrain)
        bst = lgb.train(params, dtrain, num_boost_round=10000, valid_sets=dvalid, verbose_eval=-1, early_stopping_rounds=50)
        cv_pred += bst.predict(test_data_use, num_iteration=bst.best_iteration)
        valid_best_l2_all += bst.best_score['valid_0']['l1']
        
        fold_importance_df = pd.DataFrame()
        fold_importance_df["feature"] = list(X_train.columns)
        fold_importance_df["importance"] = bst.feature_importance(importance_type='split', iteration=bst.best_iteration)
        fold_importance_df["fold"] = count + 1
        feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)
        count += 1

cv_pred /= NFOLDS
valid_best_l2_all /= NFOLDS

cv_pred_all += cv_pred
cv_pred_all /= en_amount
print('cv score for valid is: ', 1 / (1 + valid_best_l2_all))

cv_pred_all2 = 0
en_amount = 3
for seed in range(en_amount):
    NFOLDS = 5
    train_label = train_data['score']
    kfold = StratifiedKFold(n_splits=NFOLDS, shuffle=True, random_state=(seed + 2019))
    kf = kfold.split(train_data, train_label)
    
    train_data_use = train_data.drop(['uid', 'score', 'blk_list_flag'], axis=1)
    test_data_use = test_data.drop(['uid', 'blk_list_flag'], axis=1)
    
    cv_pred = np.zeros(test_data.shape[0])
    valid_best_l2_all = 0
    
    feature_importance_df = pd.DataFrame()
    count = 0
    for i, (train_fold, validate) in enumerate(kf):
        print('fold: ', i, ' training')
        X_train, X_validate, label_train, label_validate = train_data_use.iloc[train_fold, :], train_data_use.iloc[validate, :], train_label[train_fold], train_label[validate]
        dtrain = lgb.Dataset(X_train, label_train)
        dvalid = lgb.Dataset(X_validate, label_validate, reference=dtrain)
        bst = lgb.train(params2, dtrain, num_boost_round=10000, valid_sets=dvalid, verbose_eval=-1, early_stopping_rounds=50)
        cv_pred += bst.predict(test_data_use, num_iteration=bst.best_iteration)
        valid_best_l2_all += bst.best_score['valid_0']['l1']
    
        fold_importance_df = pd.DataFrame()
        fold_importance_df["feature"] = list(X_train.columns)
        fold_importance_df["importance"] = bst.feature_importance(importance_type='split', iteration=bst.best_iteration)
        fold_importance_df["fold"] = count + 1
        feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)
        count += 1

cv_pred /= NFOLDS
valid_best_l2_all /= NFOLDS

cv_pred_all2 += cv_pred

cv_pred_all2 /= en_amount
print('cv score for valid is: ', 1/(1+valid_best_l2_all))
display_importances(feature_importance_df)

# 提交
test_data_sub = test_data[['uid']]
test_data_sub['score'] = (cv_pred_all2 + cv_pred_all) / 2
test_data_sub.columns = ['id', 'score']
test_data_sub['score1'] = cv_pred_all
test_data_sub['score2'] = cv_pred_all2
test_data_sub['score'] = test_data_sub['score'].apply(lambda x: int(np.round(x)))
test_data_sub[['id', 'score']].to_csv('../output/result_bagging.csv', index=False)

5. 特征分析結果

image
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末四苇,一起剝皮案震驚了整個濱河市孝凌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月腋,老刑警劉巖胎许,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罗售,居然都是意外死亡辜窑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門寨躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆碎,“玉大人,你說我怎么就攤上這事职恳∷鳎” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵放钦,是天一觀的道長色徘。 經(jīng)常有香客問我,道長操禀,這世上最難降的妖魔是什么褂策? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮颓屑,結果婚禮上斤寂,老公的妹妹穿的比我還像新娘。我一直安慰自己揪惦,他們只是感情好遍搞,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著器腋,像睡著了一般溪猿。 火紅的嫁衣襯著肌膚如雪钩杰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天诊县,我揣著相機與錄音榜苫,去河邊找鬼。 笑死翎冲,一個胖子當著我的面吹牛垂睬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抗悍,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼驹饺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缴渊?” 一聲冷哼從身側響起赏壹,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衔沼,沒想到半個月后蝌借,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡指蚁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年菩佑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凝化。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡稍坯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搓劫,到底是詐尸還是另有隱情瞧哟,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布枪向,位于F島的核電站勤揩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秘蛔。R本人自食惡果不足惜陨亡,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缠犀。 院中可真熱鬧数苫,春花似錦聪舒、人聲如沸辨液。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滔迈。三九已至止吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燎悍,已是汗流浹背敬惦。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谈山,地道東北人俄删。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像奏路,于是被迫代替她去往敵國和親畴椰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 第一章數(shù)和數(shù)的運算 一概念 (一)整數(shù) 1整數(shù)的意義 自然數(shù)和0都是整數(shù)鸽粉。 2自然數(shù) 我們在數(shù)物體的時候斜脂,用來表示...
    meychang閱讀 2,592評論 0 5
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常触机。 O...
    我想起個好名字閱讀 5,257評論 0 9
  • From 17 to 18 嗨帚戳,我叫佩奇。 時而躁動如火儡首,時而溫柔似水片任。時而安靜得像活在象牙塔里,時而混...
    留我一人沉浮閱讀 422評論 0 0
  • 畫賦 國色天香尚自哀蔬胯, 悲聲泣自玉瓶來蚂踊。 清風細雨斜疏影, 零落成塵亦笑開笔宿。
    紅袖當空閱讀 931評論 1 0
  • 前段時間,萬科在廣州推出了一款極小戶型公寓:27-34㎡Loft+雙鑰匙設計 項目類型應該是酒店式公寓一類炬灭,所以層...
    良有方閱讀 5,531評論 0 1