先前的流程图&相关连接
缺失值处理
采用随机森林方法填充缺失值
# 填充缺失值,随机森林填充
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
还有其他的模型训练就没贴出来了。
这就是本次比赛的大致思路,可以在模型训练之前进行一下特征工程,并且训练几个较好的模型进行模型融合,应该有更好的效果。
如果觉得本文不错的话记得一键三连~