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