续第九届泰迪杯【缺失值处理&过采样&baseline训练】

先前的流程图&相关连接

在这里插入图片描述

  1. 数据预处理-可视化
  2. 数据预处理-行业划分
  3. 异常值处理
  4. 数据标准化

缺失值处理

采用随机森林方法填充缺失值

# 填充缺失值,随机森林填充  
import pandas as pd
from sklearn.impute import SimpleImputer
import numpy as np
from sklearn.ensemble import RandomForestRegressor
#读取数据的第1到最后-1
#data=data.iloc[:,1:-1]
#把缺失值大于20的列挑选出来
T=pd.read_csv(r'C:\Users\44933\Desktop\数据挖掘材料\1\makestd_noflag.csv',encoding='gbk')
all_industry = T['所属行业'].value_counts().reset_index()
#把所属行业str变为0
T['所属行业'] = T['所属行业'].apply(lambda x: all_industry['index'][x == all_industry['index']].index[0])
T_count=T.isnull().mean()
target=T.所属行业
#print(T['所属行业'])
#x_full=T.iloc[:,:-1]
#y_full=T.loc[:,'是否在当年造假']
#n_samples_num=x_full.shape[0]
#n_features_num=x_full.shape[1]
x_missing1=T.loc[:,(T_count)>0.2]
#用随机森林做一个填充
#print(x_missing1)
sortindex = x_missing1.isnull().sum().sort_values().index
sortindex = list(sortindex)
#print(len(sortindex))

for i in sortindex:
    ##构建新特征和新标签
    df = x_missing1
    fillc = df.loc[:,i]
    #print(fillc.isnull())
    #print(fillc)
    #print(type(fillc))
    ##把target标签并到去除掉i的右边
    df = pd.concat([df.loc[:,df.columns != i],target],axis=1)# target 标签
    #print(df.columns)
    #df.to_csv(r'C:\Users\44933\Desktop\合并教育数据.csv')
    
    ##在新特征中,对有缺失值的列,用0填补 df_0:数组类型
    df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)
    #print(type(df_0))
    
    ##找出训练集和测试集
    ##找出当列非空的值
    Ytrain = fillc[fillc.notnull()]
    #print(Ytrain)
    # 找出当列空的值
    Ytest = fillc[fillc.isnull()]
    #print(Ytest)
    #print(type(Ytest))
    ##根据非空值找出一整行数组
    Xtrain = df_0[Ytrain.index,:]
    #print(Xtrain)
    ##根据空值找出一整行数组
    Xtest = df_0[Ytest.index,:]
    #print(Xtest)
  
    ##⽤随机森林回归来训练预测
    rfc = RandomForestRegressor(n_estimators=50) 
    rfc = rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
    #print(Ypredict)
    ##将填补好的特征返回到我们的原始的特征中
    #print(data.loc[fillc.isnull(),i])
    x_missing1.loc[fillc.isnull(),i] = Ypredict
print(x_missing1.head())
print(T.head())
#把填充完的pd与原来的数据匹配替换
#把nomal的列名转化成列表nomal_list
normal_list=x_missing1.columns.to_list()
#读取缺失值处理的文件file
file_list=T.columns.to_list()
#读取file的列名file_list
for k in normal_list:
    if k in file_list:
        T.drop([k],axis=1,inplace=True)
        aindex=file_list.index(k)
        print(aindex)
        T.insert(aindex,k,x_missing1[k].values)
#把缺失值小于20的列挑选出来

x_missing2=T.loc[:,(T_count)<=0.2]
#用中位数填充
x_missing2.fillna(x_missing2.median(),inplace=True)
#把填充完的数据与上面的数据匹配替换
normal2_list=x_missing2.columns.to_list()
#读取缺失值处理的文件file
file_list=T.columns.to_list()
#读取file的列名file_list
for k in normal2_list:
    if k in file_list:
        T.drop([k],axis=1,inplace=True)
        aindex=file_list.index(k)
        T.insert(aindex,k,x_missing2[k].values)
T.to_csv(r'C:\Users\44933\Desktop\数据挖掘材料\1\makefill_noflag.csv',index=False)

划分训练集和验证集

训练集和测试机的比例为75:25

#划分训练集和测试集
from sklearn.model_selection import train_test_split
#读取数据
from sklearn.metrics import roc_auc_score
from sklearn.metrics import accuracy_score
import pandas as pd
data=pd.read_csv(r'C:\Users\44933\Desktop\数据挖掘材料\1\std.csv',encoding='utf-8',index_col=None)
#划分训练集、验证集
x=data.iloc[:,:-1]
y=data['是否在当年造假']
#对训练集进行过采样
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25,random_state=0)

过采样

这里只对划分好的训练集进行过采样,验证集不采样,这样才能更好地在验证集中模拟实际的效果


# 样本过采样smote
from collections import Counter
from imblearn.over_sampling import SMOTE
# 定义SMOTE模型,random_state相当于随机数种子的作用
smo = SMOTE(sampling_strategy=0.2,random_state=0,k_neighbors=5)
X_smo, y_smo = smo.fit_resample(x_train,y_train)
df1=pd.DataFrame(X_smo)
df2=pd.DataFrame(y_smo)
#过采样后分别保存训练集和测试集
train=pd.concat([df1,df2],axis=1)
print(Counter(y_smo))
#train.to_csv(r'C:\Users\44933\Desktop\数据挖掘材料\1\trainsmo.csv',index=False)
#text=pd.concat([x_test,y_test],axis=1)
#text.to_csv(r'C:\Users\44933\Desktop\数据挖掘材料\1\textsmo.csv',index=False)

模型训练与调参

这里采用xgboost和网格搜索

# xgb+网格搜索
from xgboost import XGBClassifier
xgb=XGBClassifier()
param={
    'n_estinators': [700,725,750,775,800,825],
    'max_depth': [5, 6, 7, 8,9,10],
    'min_child_weight':[1, 2, 3, 4, 5],
    'eta':[0.01,0.03, 0.05, 0.07,0.1,0.15,0.2]
}
g_xgb=GridSearchCV(xgb, param_grid=param).fit(X_smo,y_smo)
print('最优组合:', g_rfc.best_params_)
print('最优精确率:', g_rfc.best_score_ * 100, '%')
model = XGBClassifier(n_estimators=g_rfc.best_params_.get('n_estimators'),
                               max_depth=g_rfc.best_params_.get('max_depth'),
                                min_child_weight=g_rfc.best_params_.get('min_child_weight'),
                               eta=g_rfc.best_params_.get('eta'))
model.fit(X_smo,y_smo)
rf_predictions = model.predict(x_test)

# Probabilities for each class
rf_probs = model.predict_proba(x_test)[:,1]
# Calculate roc auc
roc_value = roc_auc_score(y_test, rf_probs)
roc_value

还有其他的模型训练就没贴出来了。
这就是本次比赛的大致思路,可以在模型训练之前进行一下特征工程,并且训练几个较好的模型进行模型融合,应该有更好的效果。
如果觉得本文不错的话记得一键三连~

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值