【飞桨学习赛:MarTech Challenge 点击反欺诈预测】第10名方案

该内容展示了一个模型从基线版本V1到V5的迭代过程,分数从86.746提升至89.0787。过程中进行了数据探索,处理缺失值和object类型字段,优化特征工程(如构造面积、时间差等特征),尝试LightGBM、XGBoost等模型,采用交叉验证,最终得到分数89.1093的最佳版本。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【飞桨学习赛:martech challenge 点击反欺诈预测】第10名方案 - 创想鸟

In [ ]

#best版本-89.1093分数import pandas as pdimport warningswarnings.filterwarnings('ignore')# 数据加载和去除Unnameed字段train = pd.read_csv('./train.csv')test = pd.read_csv('./test1.csv')train = train.iloc[:, 1:]test = test.iloc[:,1:]res = pd.DataFrame(test['sid'])# 去除数据探索发现问题的字段col = train.columns.tolist()remove_list = ['lan', 'os','label', 'sid']for i in remove_list:    col.remove(i)features = train[col]test_features = test[col]# 对osv进行数据清洗def osv_trans(x):    x = str(x).replace('Android_', '').replace('Android ', '').replace('W', '')    if str(x).find('.')>0:        temp_index1 = x.find('.')        if x.find(' ')>0:            temp_index2 = x.find(' ')        else:            temp_index2 = len(x)         if x.find('-')>0:            temp_index2 = x.find('-')                    result = x[0:temp_index1] + '.' + x[temp_index1+1:temp_index2].replace('.', '')        try:            return float(result)        except:            print('有错误: '+x)            return 0    try:        return float(x)    except:        print('有错误: '+x)        return 0features['osv'].fillna('8.1.0', inplace=True)features['osv'] = features['osv'].apply(osv_trans)test_features['osv'].fillna('8.1.0', inplace=True)test_features['osv'] = test_features['osv'].apply(osv_trans)# 对timestamp进行数据清洗与特征变换,from datetime import datetimefeatures['timestamp'] = features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))test_features['timestamp'] = test_features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))temp = pd.DatetimeIndex(features['timestamp'])features['year'] = temp.yearfeatures['month'] = temp.monthfeatures['day'] = temp.dayfeatures['hour'] = temp.hourfeatures['minute'] = temp.minutefeatures['week_day'] = temp.weekday #星期几start_time = features['timestamp'].min()features['time_diff'] = features['timestamp'] - start_timefeatures['time_diff'] = features['time_diff'].dt.days + features['time_diff'].dt.seconds/3600/24temp = pd.DatetimeIndex(test_features['timestamp'])test_features['year'] = temp.yeartest_features['month'] = temp.monthtest_features['day'] = temp.daytest_features['hour'] = temp.hourtest_features['minute'] = temp.minutetest_features['week_day'] = temp.weekday #星期几 test_features['time_diff'] = test_features['timestamp'] - start_timetest_features['time_diff'] = test_features['time_diff'].dt.days + test_features['time_diff'].dt.seconds/3600/24features = features.drop(['timestamp'],axis = 1)test_features = test_features.drop(['timestamp'],axis = 1)# 对version进行数据清洗与特征变换def version_trans(x):    if x=='V3':        return 3    if x=='v1':        return 1    if x=='P_Final_6':        return 6    if x=='V6':        return 6    if x=='GA3':        return 3    if x=='GA2':        return 2    if x=='V2':        return 2    if x=='50':        return 5    return int(x)features['version'] = features['version'].apply(version_trans)test_features['version'] = test_features['version'].apply(version_trans)features['version'] = features['version'].astype('int')test_features['version'] = test_features['version'].astype('int')# 对lan进行数据清洗与特征变换 对于有缺失的lan 设置为22    lan_map = {'zh-CN': 1, 'zh_CN':2, 'Zh-CN': 3, 'zh-cn': 4, 'zh_CN_#Hans':5, 'zh': 6, 'ZH': 7, 'cn':8, 'CN':9, 'zh-HK': 10, 'tw': 11, 'TW': 12, 'zh-TW': 13,             'zh-MO':14, 'en':15, 'en-GB': 16, 'en-US': 17, 'ko': 18, 'ja': 19, 'it': 20, 'mi':21} train['lan'] = train['lan'].map(lan_map)test['lan'] = test['lan'].map(lan_map)train['lan'].fillna(22, inplace=True)test['lan'].fillna(22, inplace=True)# 构造面积特征和构造相除特征features['dev_area'] = features['dev_height'] * features['dev_width']test_features['dev_area'] = test_features['dev_height'] * test_features['dev_width']features['dev_rato'] = features['dev_height'] / features['dev_width']test_features['dev_rato'] = test_features['dev_height'] / test_features['dev_width']# APP版本与操作系统版本差features['version_osv'] = features['osv'] - features['version']test_features['version_osv'] = test_features['osv'] - test_features['version']# 对fea_hash与fea1_hash特征变换features['fea_hash_len'] = features['fea_hash'].map(lambda x: len(str(x)))features['fea1_hash_len'] = features['fea1_hash'].map(lambda x: len(str(x)))features['fea_hash'] = features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))features['fea1_hash'] = features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea_hash_len'] = test_features['fea_hash'].map(lambda x: len(str(x)))test_features['fea1_hash_len'] = test_features['fea1_hash'].map(lambda x: len(str(x)))test_features['fea_hash'] = test_features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea1_hash'] = test_features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))#通过特征比,寻找关键特征,构造新特征,新特征字段 = 原始特征字段 + 1def find_key_feature(train, selected):    temp = pd.DataFrame(columns = [0,1])    temp0 = train[train['label'] == 0]    temp1 = train[train['label'] == 1]    temp[0] = temp0[selected].value_counts() / len(temp0) * 100    temp[1] = temp1[selected].value_counts() / len(temp1) * 100    temp[2] = temp[1] / temp[0]    #选出大于10倍的特征    result = temp[temp[2] > 10].sort_values(2, ascending = False).index    return resultselected_cols = ['osv','apptype', 'carrier', 'dev_height', 'dev_ppi','dev_width', 'media_id',                  'package', 'version', 'fea_hash', 'location', 'fea1_hash','cus_type']key_feature = {}for selected in selected_cols:    key_feature[selected] = find_key_feature(train, selected)def f(x, selected):    if x in key_feature[selected]:        return 1    else:        return 0for selected in selected_cols:    if len(key_feature[selected]) > 0:        features[selected+'1'] = features[selected].apply(f, args = (selected,))        test_features[selected+'1'] = test_features[selected].apply(f, args = (selected,))        print(selected+'1 created')#CatBoost模型from catboost import CatBoostClassifierfrom sklearn.model_selection import StratifiedKFoldfrom sklearn.metrics import roc_auc_scoremodel=CatBoostClassifier(            loss_function="Logloss",            eval_metric="AUC",            task_type="GPU",            learning_rate=0.1,            iterations=1000,            random_seed=2021,            od_type="Iter",            depth=7)n_folds =10 #十折交叉校验answers = []mean_score = 0data_x=featuresdata_y=train['label']sk = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=2021)all_test = test_features.copy()for train, test in sk.split(data_x, data_y):      x_train = data_x.iloc[train]    y_train = data_y.iloc[train]    x_test = data_x.iloc[test]    y_test = data_y.iloc[test]    clf = model.fit(x_train,y_train, eval_set=(x_test,y_test),verbose=500) # 500条打印一条日志        yy_pred_valid=clf.predict(x_test,prediction_type='Probability')[:,-1]    print('cat验证的auc:{}'.format(roc_auc_score(y_test, yy_pred_valid)))    mean_score += roc_auc_score(y_test, yy_pred_valid) / n_folds        y_pred_valid = clf.predict(all_test,prediction_type='Probability')[:,-1]    answers.append(y_pred_valid) print('mean valAuc:{}'.format(mean_score))cat_pre=sum(answers)/n_foldscat_preres['label']=[1 if x>=0.5 else 0 for x in cat_pre]res.to_csv('./baselinev6.csv',index=False)

       

有错误: f073b_changxiang_v01_b1b8_20180915有错误: %E6%B1%9F%E7%81%B5OS+5.0有错误: GIONEE_YNGA

       

项目思考的过程与baseline迭代版本

BaseLine V1_lgb–分数: 86.746

切换盘符:

jupyter notebook D:

       

一、数据探索

1、去除Unnameed字段

train = train.iloc[:, 1:]test = test.iloc[:,1:]

       

2、查看字段类型

写法1:

train.info()

       

写法2:

或者直接查看类型为object的列

train.select_dtypes(include='object').columns

       

发现以下字段为object类型需要进行数值变换

 7   lan         316720 non-null  object  10  os          500000 non-null  object  11  osv         493439 non-null  object  15  version     500000 non-null  object  16  fea_hash    500000 non-null  object

       

以lan为例查看里面数据情况

train['lan'].value_counts()

       

3、查看缺失值的个数

写法1:

train.isnull().sum()

       

写法2:

t = train.isnull().sum()t[t>0]

       

发现以下字段缺少比较多

lan           183280osv             6561

       

4、唯一值的个数

查看唯一值的个数

features = train.columns.tolist()for feature in features:    if train[feature].nunique() ==1:        print(feature,train[feature].nunique())

       

发现os字段的唯一值个数太少

os 2

       

查看os

train['os'].value_counts()

       

发现os数据都为android

android    303175Android    196825Name: os, dtype: int64

       

5、数据探索的结论

object类型字段有:lan、osv 、osv、version、fea_hash

缺失值较多的字段有:lan、osv

唯一值个数较少且意义不大:os

没有意义的字段:sid

BaselineV1中也先去除timestamp

6、特征的相关性分析(补充)

# 对特征列进行相关性分析import matplotlib.pyplot as plt%matplotlib inlineimport seaborn as snsplt.figure(figsize=(10,10))sns.heatmap(train.corr(),cbar=True,annot=True,cmap='Blues')

       

二、数据预处理

最终去掉:【lan】【os】【osv】【version】【label】【sid】【timestamp】

remove_list = ['lan', 'os', 'osv', 'version', 'label', 'sid','timestamp']col = features #字段名for i in remove_list:    col.remove(i)features = train[col]

       

三、特征工程

1、fea_hash特征变换

#查看数据值train['fea_hash'].value_counts()#查看统计信息train['fea_hash'].describe()#查看映射的长度特征情况train['fea_hash'].map(lambda x:len(str(x))).value_counts()

       

fea_hash进行特征变换

# fea_hash的长度为新特征features['fea_hash_len'] = features['fea_hash'].map(lambda x: len(str(x)))features['fea1_hash_len'] = features['fea1_hash'].map(lambda x: len(str(x)))# 如果fea_hash很长,都归为0,否则为自己的本身features['fea_hash'] = features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))features['fea1_hash'] = features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))

       

四、模型建立

test 做和train同样处理,利用lightgbm进行训练与预测,并保存,上诉过程全部合并代码如下:

#BaselineV1import pandas as pdimport warningsimport lightgbm as lgbwarnings.filterwarnings('ignore')# 数据加载train = pd.read_csv('./train.csv')test = pd.read_csv('./test1.csv')# 去除Unnameed字段train = train.iloc[:, 1:]test = test.iloc[:,1:]# 去除数据探索发现问题的字段col = train.columns.tolist()remove_list = ['lan', 'os', 'osv', 'version', 'label', 'sid','timestamp']for i in remove_list:    col.remove(i)features = train[col]test_features = test[col]# fea_hash特征变换features['fea_hash_len'] = features['fea_hash'].map(lambda x: len(str(x)))features['fea1_hash_len'] = features['fea1_hash'].map(lambda x: len(str(x)))features['fea_hash'] = features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))features['fea1_hash'] = features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea_hash_len'] = test_features['fea_hash'].map(lambda x: len(str(x)))test_features['fea1_hash_len'] = test_features['fea1_hash'].map(lambda x: len(str(x)))test_features['fea_hash'] = test_features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea1_hash'] = test_features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))#lightgbm进行训练与预测model = lgb.LGBMClassifier()model.fit(features,train['label'])result = model.predict(test_features)#res包括sid字段与label字段res = pd.DataFrame(test['sid'])res['label'] = result#保存在csv中res.to_csv('./baselineV1.csv',index=False)

       

BaseLine V2_lgb–分数: 88.2007

一、特征工程优化

1、利用osv特征

# 对osv进行数据清洗def osv_trans(x):    x = str(x).replace('Android_', '').replace('Android ', '').replace('W', '')    if str(x).find('.')>0:        temp_index1 = x.find('.')        if x.find(' ')>0:            temp_index2 = x.find(' ')        else:            temp_index2 = len(x)         if x.find('-')>0:            temp_index2 = x.find('-')                    result = x[0:temp_index1] + '.' + x[temp_index1+1:temp_index2].replace('.', '')        try:            return float(result)        except:            print('有错误: '+x)            return 0    try:        return float(x)    except:        print('有错误: '+x)        return 0features['osv'].fillna('8.1.0', inplace=True)features['osv'] = features['osv'].apply(osv_trans)test_features['osv'].fillna('8.1.0', inplace=True)test_features['osv'] = test_features['osv'].apply(osv_trans)

       

2、利用TimeStamp特征

提取时间多尺度并计算时间diff(时间差)

# 对timestamp进行数据清洗与特征变换from datetime import datetimefeatures['timestamp'] = features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))test_features['timestamp'] = test_features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))temp = pd.DatetimeIndex(features['timestamp'])features['year'] = temp.yearfeatures['month'] = temp.monthfeatures['day'] = temp.dayfeatures['hour'] = temp.hourfeatures['minute'] = temp.minutefeatures['week_day'] = temp.weekday #星期几start_time = features['timestamp'].min()features['time_diff'] = features['timestamp'] - start_timefeatures['time_diff'] = features['time_diff'].dt.days + features['time_diff'].dt.seconds/3600/24temp = pd.DatetimeIndex(test_features['timestamp'])test_features['year'] = temp.yeartest_features['month'] = temp.monthtest_features['day'] = temp.daytest_features['hour'] = temp.hourtest_features['minute'] = temp.minutetest_features['week_day'] = temp.weekday #星期几 test_features['time_diff'] = test_features['timestamp'] - start_timetest_features['time_diff'] = test_features['time_diff'].dt.days + test_features['time_diff'].dt.seconds/3600/24col = features.columns.tolist()col.remove('timestamp')features = features[col]test_features = test_features[col]

       

3、利用Version特征

# 对version进行数据清洗与特征变换def version_trans(x):    if x=='V3':        return 3    if x=='v1':        return 1    if x=='P_Final_6':        return 6    if x=='V6':        return 6    if x=='GA3':        return 3    if x=='GA2':        return 2    if x=='V2':        return 2    if x=='50':        return 5    return int(x)features['version'] = features['version'].apply(version_trans)test_features['version'] = test_features['version'].apply(version_trans)features['version'] = features['version'].astype('int')test_features['version'] = test_features['version'].astype('int')

       

二、模型建立

上诉过程合并代码如下:

import pandas as pdimport warningsimport lightgbm as lgbwarnings.filterwarnings('ignore')# 数据加载和去除Unnameed字段train = pd.read_csv('./train.csv')test = pd.read_csv('./test1.csv')train = train.iloc[:, 1:]test = test.iloc[:,1:]# 去除数据探索发现问题的字段col = train.columns.tolist()remove_list = ['lan', 'os','label', 'sid']for i in remove_list:    col.remove(i)features = train[col]test_features = test[col]# 对osv进行数据清洗def osv_trans(x):    x = str(x).replace('Android_', '').replace('Android ', '').replace('W', '')    if str(x).find('.')>0:        temp_index1 = x.find('.')        if x.find(' ')>0:            temp_index2 = x.find(' ')        else:            temp_index2 = len(x)         if x.find('-')>0:            temp_index2 = x.find('-')                    result = x[0:temp_index1] + '.' + x[temp_index1+1:temp_index2].replace('.', '')        try:            return float(result)        except:            print('有错误: '+x)            return 0    try:        return float(x)    except:        print('有错误: '+x)        return 0features['osv'].fillna('8.1.0', inplace=True)features['osv'] = features['osv'].apply(osv_trans)test_features['osv'].fillna('8.1.0', inplace=True)test_features['osv'] = test_features['osv'].apply(osv_trans)# 对timestamp进行数据清洗与特征变换,from datetime import datetimefeatures['timestamp'] = features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))test_features['timestamp'] = test_features['timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))temp = pd.DatetimeIndex(features['timestamp'])features['year'] = temp.yearfeatures['month'] = temp.monthfeatures['day'] = temp.dayfeatures['hour'] = temp.hourfeatures['minute'] = temp.minutefeatures['week_day'] = temp.weekday #星期几start_time = features['timestamp'].min()features['time_diff'] = features['timestamp'] - start_timefeatures['time_diff'] = features['time_diff'].dt.days + features['time_diff'].dt.seconds/3600/24temp = pd.DatetimeIndex(test_features['timestamp'])test_features['year'] = temp.yeartest_features['month'] = temp.monthtest_features['day'] = temp.daytest_features['hour'] = temp.hourtest_features['minute'] = temp.minutetest_features['week_day'] = temp.weekday #星期几 test_features['time_diff'] = test_features['timestamp'] - start_timetest_features['time_diff'] = test_features['time_diff'].dt.days + test_features['time_diff'].dt.seconds/3600/24features = features.drop(['timestamp'],axis = 1)test_features = test_features.drop(['timestamp'],axis = 1)# 对version进行数据清洗与特征变换def version_trans(x):    if x=='V3':        return 3    if x=='v1':        return 1    if x=='P_Final_6':        return 6    if x=='V6':        return 6    if x=='GA3':        return 3    if x=='GA2':        return 2    if x=='V2':        return 2    if x=='50':        return 5    return int(x)features['version'] = features['version'].apply(version_trans)test_features['version'] = test_features['version'].apply(version_trans)features['version'] = features['version'].astype('int')test_features['version'] = test_features['version'].astype('int')# 对fea_hash与fea1_hash特征变换features['fea_hash_len'] = features['fea_hash'].map(lambda x: len(str(x)))features['fea1_hash_len'] = features['fea1_hash'].map(lambda x: len(str(x)))features['fea_hash'] = features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))features['fea1_hash'] = features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea_hash_len'] = test_features['fea_hash'].map(lambda x: len(str(x)))test_features['fea1_hash_len'] = test_features['fea1_hash'].map(lambda x: len(str(x)))test_features['fea_hash'] = test_features['fea_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))test_features['fea1_hash'] = test_features['fea1_hash'].map(lambda x: 0 if len(str(x))>16 else int(x))#lightgbm进行训练与预测model = lgb.LGBMClassifier()model.fit(features,train['label'])result = model.predict(test_features)#res包括sid字段与label字段res = pd.DataFrame(test['sid'])res['label'] = result#保存在csv中res.to_csv('./baselineV2.csv',index=False)print("已完成")

       

BaseLine V3_xgb–分数: 88.5073

一、特征工程优化

1、构造面积特征和相除特征

features['dev_area'] = features['dev_height'] * features['dev_width']test_features['dev_area'] = test_features['dev_height'] * test_features['dev_width']features['dev_rato'] = features['dev_height'] / features['dev_width']test_features['dev_rato'] = test_features['dev_height'] / test_features['dev_width']

       

2、APP版本与操作系统版本差

features['version_osv'] = features['osv'] - features['version']test_features['version_osv'] = test_features['osv'] - test_features['version']

       

二、xgboost模型

1、LightGBM 祖传参数

clf = lgb.LGBMClassifier(            num_leaves=2**5-1, reg_alpha=0.25, reg_lambda=0.25, objective='multiclass',            max_depth=-1, learning_rate=0.005, min_child_samples=3, random_state=2021,            n_estimators=2000, subsample=1, colsample_bytree=1)device = gpugpu_platform_id = 0gpu_device_id = 0

       

2、XGBoost祖传参数

model_xgb = xgb.XGBClassifier(            max_depth=9, learning_rate=0.005, n_estimators=2000,             objective='multi:softprob', tree_method='gpu_hist',             subsample=0.8, colsample_bytree=0.8,             min_child_samples=3, eval_metric='logloss', reg_lambda=0.5)

       

3、使用xgboost并使用祖传参数

%%time#lightgbm进行训练与预测import xgboost as xgbmodel_xgb = xgb.XGBClassifier(            max_depth=15, learning_rate=0.05, n_estimators=5000,             objective='binary:logistic', tree_method='gpu_hist',             subsample=0.8, colsample_bytree=0.8,             min_child_samples=3, eval_metric='auc', reg_lambda=0.5        )model_xgb.fit(features,train['label'])result_xgb = model.predict(test_features)res = pd.DataFrame(test['sid'])res['label'] = result_xgbres.to_csv('./baselineV3.csv',index=False)print("已完成")

       

使用了xgboost的祖传参数

参数 含义

max_depth含义:树的最大深度,用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本,需要使用CV函数来进行调优。 
默认值:6,典型值:3-10。
调参:值越大,越容易过拟合;值越小,越容易欠拟合。learning_rate含义:学习率,控制每次迭代更新权重时的步长
默认值:0.3,典型值:0.01-0.2。 
调参:值越小,训练越慢。n_estimators总共迭代的次数,即决策树的个数,相当于训练的轮数objective回归任务:reg:linear (默认) reg: logistic 
二分类 binary:logistic (概率) binary:logitraw (类别) 
多分类 multi:softmax num_class=n (返回类别) multi:softprob num_class=n(返回概率)tree_method可调用gpu:gpu_hist。使用功能的树的构建方法,hist代表使用直方图优化的近似贪婪的算法subsample含义:训练样本采样率(行采样),训练每棵树时,使用的数据占全部训练集的比例。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
默认值:1,典型值:0.5-1。
调参:防止过拟合。colsample_bytree含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 
典型值:0.5-1 
调参:防止过拟合。min_child_samples
eval_metric用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序
可供的选择如下: 
回归任务(默认rmse) :rmse–均方根误差 mae–平均绝对误差 
分类任务(默认error) : auc–roc曲线下面积 error–错误率(二分类) merror–错误率(多分类) logloss–负对数似然函数(二分类) mlogloss–负对数似然函数(多分类)reg_lambdaL2正则化系数

4、可视化的方式查看特征的重要程度

from xgboost import plot_importanceimport matplotlib.pyplot as pltplot_importance(model_xgb)

       

BaseLine V4_xgb–分数: 88.946

一、使用十折交叉验证优化

%%time# 定义10折子模型from sklearn.model_selection import StratifiedKFoldfrom sklearn.metrics import accuracy_scoredef xgb_model(clf,train_x,train_y,test):    sk=StratifiedKFold(n_splits=10,random_state=2021,shuffle = True)    prob=[]    mean_acc=0    for k,(train_index,val_index) in enumerate(sk.split(train_x,train_y)):        train_x_real=train_x.iloc[train_index]        train_y_real=train_y.iloc[train_index]        val_x=train_x.iloc[val_index]        val_y=train_y.iloc[val_index]        #模型训练及验证集测试        clf=clf.fit(train_x_real,train_y_real)        val_y_pred=clf.predict(val_x)        acc_val=accuracy_score(val_y,val_y_pred)        print('第{}个子模型 accuracy{}'.format(k+1,acc_val))        mean_acc+=mean_acc/10        #预测测试集        test_y_pred=clf.predict_proba(test)        prob.append(test_y_pred)    print(mean_acc)    mean_prob=sum(prob)/10    return mean_prob  import xgboost as xgbmodel_xgb2 = xgb.XGBClassifier(            max_depth=15, learning_rate=0.005, n_estimators=5300,             objective='binary:logistic', tree_method='gpu_hist',             subsample=0.7, colsample_bytree=0.7,             min_child_samples=3, eval_metric='auc', reg_lambda=0.5        )result_xgb=xgb_model(model_xgb2,features,train['label'],test_features) result_xgb2=[x[1] for x in result_xgb]result_xgb2=[1 if x>=0.5 else 0 for x in result_xgb2] res = pd.DataFrame(test['sid'])res['label'] = result_xgb2res.to_csv('./baselineV4.csv', index=False)print('已完成')

       

BaseLine V5_xgb–分数: 89.0787

一、特征工程优化

通过特征比,寻找关键特征,构造新特征,新特征字段 = 原始特征字段 + 1

#通过特征比,寻找关键特征,构造新特征,新特征字段 = 原始特征字段 + 1def find_key_feature(train, selected):    temp = pd.DataFrame(columns = [0,1])    temp0 = train[train['label'] == 0]    temp1 = train[train['label'] == 1]    temp[0] = temp0[selected].value_counts() / len(temp0) * 100    temp[1] = temp1[selected].value_counts() / len(temp1) * 100    temp[2] = temp[1] / temp[0]    #选出大于10倍的特征    result = temp[temp[2] > 10].sort_values(2, ascending = False).index    return resultselected_cols = ['osv','apptype', 'carrier', 'dev_height', 'dev_ppi','dev_width', 'media_id',                  'package', 'version', 'fea_hash', 'location', 'fea1_hash','cus_type']key_feature = {}for selected in selected_cols:    key_feature[selected] = find_key_feature(train, selected)key_featuredef f(x, selected):    if x in key_feature[selected]:        return 1    else:        return 0for selected in selected_cols:    if len(key_feature[selected]) > 0:        features[selected+'1'] = features[selected].apply(f, args = (selected,))        test_features[selected+'1'] = test_features[selected].apply(f, args = (selected,))        print(selected+'1 created')

   

以上就是【飞桨学习赛:MarTech Challenge 点击反欺诈预测】第10名方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/39572.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
回坑原作? 《空洞骑士》在《丝之歌》发布后在线人数创新高
上一篇 2025年11月6日 03:06:16
windows10的tpm是什么怎么查看版本_windows10TPM功能介绍及版本查看方法
下一篇 2025年11月6日 03:08:18

相关推荐

  • Sublime怎么卸载不需要的构建系统_清理和管理BuildSystem文件

    Sublime怎么卸载不需要的构建系统_清理和管理BuildSystem文件Sublime怎么卸载不需要的构建系统_清理和管理BuildSystem文件Sublime怎么卸载不需要的构建系统_清理和管理BuildSystem文件Sublime怎么卸载不需要的构建系统_清理和管理BuildSystem文件

    首先删除用户目录下不需要的.sublime-build文件,再通过Package Control卸载相关插件并清理残留文件,最后刷新缓存或重启软件以更新构建系统列表。 如果您在使用Sublime Text时发现构建系统列表中存在不需要的或重复的Build System选项,可能是由于手动添加的构建配…

    2026年9月29日 • 用户投稿
    300
  • 豆包AI可以设置定时提醒吗 豆包AI日程管理功能使用教程

    豆包AI可以设置定时提醒吗 豆包AI日程管理功能使用教程豆包AI可以设置定时提醒吗 豆包AI日程管理功能使用教程豆包AI可以设置定时提醒吗 豆包AI日程管理功能使用教程豆包AI可以设置定时提醒吗 豆包AI日程管理功能使用教程

    豆包ai目前不支持直接设置定时提醒,但可通过多种变通方法实现。①利用其文本生成能力,生成提醒文案并复制到手机自带提醒应用;②结合语音助手生成语音指令,通过语音助手设置提醒;③未来若开放api接口,可联动其他应用自动同步提醒事项;④使用豆包ai日程管理功能,添加日程并设置提前时间推送提醒。此外,还可通…

    2026年9月29日 • 用户投稿
    000
  • 优化Java代码:使用除法和取模运算简化找零计算

    优化Java代码:使用除法和取模运算简化找零计算优化Java代码:使用除法和取模运算简化找零计算优化Java代码:使用除法和取模运算简化找零计算优化Java代码:使用除法和取模运算简化找零计算

    本文旨在帮助Java初学者优化其找零计算代码,通过使用除法和取模运算,避免冗长的while循环,从而提高代码效率和可读性。我们将提供详细的代码示例和解释,帮助读者理解并掌握这种更简洁的实现方式。 原代码使用多个while循环来计算每种面额的硬币数量,这使得代码冗长且不易维护。更优的解决方案是使用除法…

    2026年9月29日 • 用户投稿
    000
  • 主板BIOS功能深度解析:以华硕ROG、微星MEG、技嘉AORUS为例

    主板BIOS功能深度解析:以华硕ROG、微星MEG、技嘉AORUS为例主板BIOS功能深度解析:以华硕ROG、微星MEG、技嘉AORUS为例主板BIOS功能深度解析:以华硕ROG、微星MEG、技嘉AORUS为例主板BIOS功能深度解析:以华硕ROG、微星MEG、技嘉AORUS为例

    华硕ROG、微星MEG和技嘉AORUS旗舰主板提供BIOS更新、电源管理、网络唤醒、虚拟化及超频等核心功能;通过USB BIOS FlashBack、M-Flash、Q-Flash实现免CPU更新,支持远程开机与断电自启,并可开启虚拟化技术及精细超频调校,提升系统稳定性与性能释放。 要深入理解现代主…

    2026年9月29日 • 用户投稿
    000
  • Java归并排序:修复数组元素覆盖问题及代码优化

    Java归并排序:修复数组元素覆盖问题及代码优化Java归并排序:修复数组元素覆盖问题及代码优化Java归并排序:修复数组元素覆盖问题及代码优化Java归并排序:修复数组元素覆盖问题及代码优化

    本文旨在解决Java实现归并排序时出现的数组元素覆盖问题,该问题导致排序只能处理少量元素。文章将分析问题代码,指出错误原因,并提供修正后的代码示例。此外,还会探讨代码风格优化,建议使用接口而非具体类进行编程。 问题分析 提供的Java代码实现了归并排序算法,但存在一个关键错误,导致在合并过程中覆盖了…

    2026年9月29日 • 用户投稿
    000
  • PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级

    PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级

    ? PandaCoder 1.1.8 发布:中文开发者的智能编码助手全面升级 让中文开发者告别命名困扰,拥抱高效编程新时代! ? 版本亮点 PandaCoder 1.1.8 作为内测版本,带来了全新的Bug记录功能本地文件启用禁用功能,让开发者可以更灵活地管理错误信息存储方式。这个版本不仅延续了插件…

    2026年9月29日 • 用户投稿
    100
  • Piti插件怎么使用云端模板_Piti插件使用云端模板详细说明

    Piti插件怎么使用云端模板_Piti插件使用云端模板详细说明Piti插件怎么使用云端模板_Piti插件使用云端模板详细说明Piti插件怎么使用云端模板_Piti插件使用云端模板详细说明Piti插件怎么使用云端模板_Piti插件使用云端模板详细说明

    首先确认Piti插件为最新版本并保持稳定网络连接,随后在设置中开启“允许加载云端模板”功能,接着通过插件内“模板中心”浏览并下载所需云端模板,下载完成后在新建文档时选择已下载的云端模板进行应用,最后定期返回“云端模板”页面检查并更新模板版本以确保内容生成效率与兼容性。 如果您在使用Piti插件时希望…

    2026年9月29日 • 用户投稿
    000
  • 新手如何安装Sublime_保姆级Sublime安装图文教程

    新手如何安装Sublime_保姆级Sublime安装图文教程新手如何安装Sublime_保姆级Sublime安装图文教程新手如何安装Sublime_保姆级Sublime安装图文教程新手如何安装Sublime_保姆级Sublime安装图文教程

    Sublime Text是适合新手的轻量级代码编辑器,支持多语言且插件丰富;首先从官网下载对应系统安装包,避免第三方风险;接着双击安装文件按向导完成安装,建议使用默认路径并创建快捷方式;启动后熟悉界面布局,包括菜单栏和编辑区;通过“Preferences > Settings”配置行号、自动换…

    2026年9月29日 • 用户投稿
    000
  • 怎么用豆包AI帮我写机器学习代码 3分钟学会用AI生成TensorFlow/PyTorch代码

    怎么用豆包AI帮我写机器学习代码 3分钟学会用AI生成TensorFlow/PyTorch代码怎么用豆包AI帮我写机器学习代码 3分钟学会用AI生成TensorFlow/PyTorch代码怎么用豆包AI帮我写机器学习代码 3分钟学会用AI生成TensorFlow/PyTorch代码怎么用豆包AI帮我写机器学习代码 3分钟学会用AI生成TensorFlow/PyTorch代码

    豆包ai能快速生成tensorflow或pytorch代码框架,节省查文档时间。1. 明确任务类型,具体说明是分类还是回归、数据类型及框架;2. 输入清晰指令后,ai会生成包括数据加载、模型定义、损失函数、优化器和训练循环的基础代码;3. 自行补充关键细节如设备判断、模型保存逻辑等使代码可运行;4.…

    2026年9月29日 • 用户投稿
    000
  • 主板 PCIe 通道拆分功能详解与应用场景

    主板 PCIe 通道拆分功能详解与应用场景主板 PCIe 通道拆分功能详解与应用场景主板 PCIe 通道拆分功能详解与应用场景主板 PCIe 通道拆分功能详解与应用场景

    PCIe通道拆分指将CPU直连的x16通道按需分配为x8/x8或x8/x4/x4等模式,由主板BIOS设置并受CPU与芯片组支持,用于双显卡、多NVMe SSD或专业扩展卡的高效协同,确保各设备获得足够带宽,避免性能瓶颈。 主板上的 PCIe 通道拆分功能,是影响高性能硬件扩展能力的重要设计之一。它…

    2026年9月29日 • 用户投稿
    100
  • 优化Java代码:使用除法和取模简化找零计算

    优化Java代码:使用除法和取模简化找零计算优化Java代码:使用除法和取模简化找零计算优化Java代码:使用除法和取模简化找零计算优化Java代码:使用除法和取模简化找零计算

    本文旨在提供一种更简洁高效的Java代码实现找零计算功能的方法。通过使用除法和取模运算,可以避免冗长的while循环,显著缩短代码长度并提高程序性能。文章将详细介绍如何利用这两种运算直接计算出各种面额的货币数量,并提供完整的代码示例和必要的解释。 简化找零计算逻辑 原始代码使用了多个while循环来…

    2026年9月29日 • 用户投稿
    100
  • Sublime怎么一键格式化并运行代码_组合命令构建系统设置

    Sublime怎么一键格式化并运行代码_组合命令构建系统设置Sublime怎么一键格式化并运行代码_组合命令构建系统设置Sublime怎么一键格式化并运行代码_组合命令构建系统设置Sublime怎么一键格式化并运行代码_组合命令构建系统设置

    通过创建自定义构建系统,Sublime Text可实现一键格式化并运行代码:先配置包含格式化与运行命令的JSON文件,如Python使用yapf和python命令,JavaScript使用prettier和node,或通过Shell脚本封装复杂逻辑,保存为.sublime-build文件后选择对应编…

    2026年9月29日 • 用户投稿
    000
  • 怎么用AI修改简历?AI一键润色简历

    使用AI修改简历可高效优化表达、匹配岗位,需选择合适工具,输入岗位描述及个人方向,通过一键润色提升专业性,并人工核对内容真实性与一致性,最终显著增强简历竞争力。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 用AI修改简历已经变得非常简单高…

    2026年9月29日
    200
  • CodeIgniter权限管理:解决复选框数据插入数据库失败的问题

    本文旨在解决CodeIgniter框架中,用户通过复选框选择权限后数据无法成功插入数据库的问题。我们将深入分析控制器、模型和视图代码,指出常见的逻辑错误,并提供一套系统的故障排除与调试策略,包括修正代码逻辑、利用XDebug、检查PHP错误日志、验证数据库连接与表约束,确保权限数据能够稳定、准确地写…

    2026年9月29日
    200
  • SublimeText如何实时预览Markdown文件_MarkdownPreview插件使用

    SublimeText如何实时预览Markdown文件_MarkdownPreview插件使用SublimeText如何实时预览Markdown文件_MarkdownPreview插件使用SublimeText如何实时预览Markdown文件_MarkdownPreview插件使用SublimeText如何实时预览Markdown文件_MarkdownPreview插件使用

    最直接的方法是使用MarkdownPreview插件实现Sublime Text中Markdown文件的实时预览,安装后通过命令面板选择“Preview in Browser”即可在浏览器中查看渲染效果,保存时自动刷新;常见问题包括服务器未启动、样式异常和刷新失效,可通过检查控制台、修改端口、自定义…

    2026年9月29日 • 用户投稿
    200
  • win8系统重置需要多长时间_Win8系统重置耗时说明

    win8系统重置需要多长时间_Win8系统重置耗时说明win8系统重置需要多长时间_Win8系统重置耗时说明win8系统重置需要多长时间_Win8系统重置耗时说明win8系统重置需要多长时间_Win8系统重置耗时说明

    刷新PC模式约耗时8分22秒,保留文件并重装系统;快速删除模式平均6分钟完成,清除数据并快速格式化;彻底清除驱动器需2小时以上,采用多轮覆写确保数据不可恢复。 如果您尝试将Windows 8系统恢复到出厂状态,具体耗时取决于所选的重置模式和硬件配置。不同操作方式会导致显著的时间差异。 本文运行环境:…

    2026年9月29日 • 用户投稿
    400
  • 多模态AI如何处理地震波数据 多模态AI地质灾害预警系统

    多模态AI如何处理地震波数据 多模态AI地质灾害预警系统多模态AI如何处理地震波数据 多模态AI地质灾害预警系统多模态AI如何处理地震波数据 多模态AI地质灾害预警系统多模态AI如何处理地震波数据 多模态AI地质灾害预警系统

    多模态ai通过整合地震波、地表形变、气象数据、历史记录及地质信息等多种数据源,构建综合分析模型,显著提升了地震预警的准确性。1)结合地震波与insar地表形变数据,实现更准确的地震定位;2)融合地震波与历史数据,提升震级估计精度;3)实时监测形变与气象数据,加快预警发布速度;4)整合地质结构与历史记…

    2026年9月29日 • 用户投稿
    100
  • SublimeText如何进行代码折叠_快速收起和展开代码块技巧

    SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧SublimeText如何进行代码折叠_快速收起和展开代码块技巧

    Sublime Text通过快捷键、侧边栏标记和上下文菜单实现代码折叠,提升代码阅读与导航效率。核心操作包括:Ctrl+Shift+[ / ](折叠/展开当前块)、Ctrl+K, Ctrl+0(折叠所有)、Ctrl+K, Ctrl+J(展开所有),以及按层级折叠和折叠HTML属性。这些功能降低认知负…

    2026年9月29日 • 用户投稿
    200
  • Java构造函数中this引用的陷阱与循环依赖解决方案

    Java构造函数中this引用的陷阱与循环依赖解决方案Java构造函数中this引用的陷阱与循环依赖解决方案Java构造函数中this引用的陷阱与循环依赖解决方案Java构造函数中this引用的陷阱与循环依赖解决方案

    在Java继承体系中,子类构造函数在调用super()之前无法引用this,因为对象尚未完全初始化。当父类构造函数需要子类实例(this)作为参数,而子类又需要将this传递给其内部依赖(如ParameterData)时,便会产生“无法在调用超类构造函数之前引用’this’”…

    2026年9月29日 • 用户投稿
    200
  • Java构造器中this引用的限制与对象间循环依赖的解决方案

    Java构造器中this引用的限制与对象间循环依赖的解决方案Java构造器中this引用的限制与对象间循环依赖的解决方案Java构造器中this引用的限制与对象间循环依赖的解决方案Java构造器中this引用的限制与对象间循环依赖的解决方案

    在Java中,子类构造器在调用super()之前,无法引用this,因为此时对象尚未完全初始化,特别是父类部分和final字段可能未被赋值。当设计中出现对象间循环依赖,尤其涉及final字段时,会导致“Cannot reference ‘this’ before supert…

    2026年9月29日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信