2020人工智能应用赛结构化赛题方案(0.859+)

方案

  • catboost单模单折
import pandas as pd
import numpy as np
from imblearn.over_sampling import SMOTE,ADASYN#过采样
from sklearn.preprocessing import LabelEncoder#离散化
from sklearn.feature_selection import RFE#特征筛选
from imblearn.under_sampling import ClusterCentroids#降采样
from fancyimpute import KNN#缺失值填充
import missingno as msno#缺失值显示分析
import matplotlib.pyplot as plt#画图
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis#LDA 0.80
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis#QDA
from sklearn.preprocessing import StandardScaler#标准化

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

导入一些包,可能由于效果不是很好,将这些包相关的部分代码注释或者删除,不过大体做的一些尝试在这里可以看出来。

def process(df):
    df=pd.get_dummies(df,columns=categorys,dummy_na=True)
    df.drop(['ID'],axis=1,inplace=True)
#     df.fillna(method='bfill',inplace=True,axis=0,limit=3)
    df.fillna(0,inplace=True)
    return df
    
categorys=['性别','区域','肥胖腰围','血脂异常','PVD','体育活动','教育','未婚','护理来源','视力不佳','饮酒','高血压',
           '家庭高血压','糖尿病','家族糖尿病','家族肝炎','慢性疲劳','ALF']

train=pd.read_csv('训练集路径')
test=pd.read_csv('测试集路径')
test = test.sort_values(by = ['ID'])
train=train.dropna(subset=['肝炎'])

train=process(train)
test=process(test)

这里处理部分对各类别进行了onehot操作,变为离散值后,应该更适合使用catboost模型

data=train.drop('肝炎',axis=1)
target=train['肝炎']

target.name='label'
data.columns=range(data.shape[1])
test.columns=range(test.shape[1])

data=data.reset_index(drop=True)
target=target.reset_index(drop=True)

因为lightgbm不支持中文列名,虽然最终没有使用lgb,而是使用ctb,不过这里还是进行了一些处理。

from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifier
from sklearn.linear_model import LogisticRegression
from lightgbm import LGBMClassifier
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn.model_selection import StratifiedKFold

# smo=SMOTE(random_state=42)
# x_smo,y_smo=smo.fit_resample(data, target)

# smo=SMOTE(random_state=3090,sampling_strategy={0:3500,1:350})
# x_smo,y_smo=smo.fit_resample(x_resampled, y_resampled)

# cc = ClusterCentroids(random_state=3090,sampling_strategy={0:4000,1:400})
# x_resampled, y_resampled = cc.fit_resample(data, target)

train_x,test_x,train_y,test_y=train_test_split(data, target,test_size=0.3,random_state=3090)

model=CatBoostClassifier(
                        n_estimators=10000,
                         eval_metric='AUC',
                        use_best_model=True,
                        learning_rate=0.001,
                        l2_leaf_reg=20,
                        random_seed=3090
#                         class_weights={0:weight[0],1:weight[1]}
                        )


model.fit(train_x,train_y,eval_set=[(test_x,test_y)],early_stopping_rounds=500,verbose=100)

class_weights以及过采样算法,在线下似乎效果不好

这里参数的设置,白嫖了一波鱼佬之前开源的代码的参数,调参之后从0.854提升到0.859
迭代次数(n_estimators)设置得大一点,因为设置了早停参数(early_stopping_rounds):若500次迭代没有提升,则提前结束。


由于官方似乎不愿意开放数据,因此这里也无法提供具体的数据。

赛事链接如下:
https://www.kesci.com/home/competition/5f34b039a5c0e8002d5d008e

你可能感兴趣的:(大数据)