发现随机森林的正确率在0.76-0.86左右,多次用随机森林找一个正确率大于0.84的模型输出答案
这次用到的参数:
rfc=RandomForestClassifier(n_estimators=100 #决策树的数量
,criterion=“entropy” #分类标准-信息熵or基尼系数
,max_depth=4 #决策树最大深度
,min_samples_split=10) #至少有10个数据,树才会继续分支
。
把训练集分为新训练集和新问题集,在这上面验证准确性
Xtrain, Xtest, Ytrain, Ytest = train_test_split(arr_t[:,:-1],arr_t[:,-1],test_size=0.3) #(数据集,答案集,如何划分)0.3表示训练集和问题集三七分
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
#随机森林分类器
from sklearn.model_selection import train_test_split
#功能:将数据集分为训练集测试集 Xtrain,Xtest,Ytrain,Ytest
df_t=pd.read_excel(r'D:\EdgeDownloadPlace\3dd40612152202ee8440f82a3d277008\train.xlsx')
df_a=pd.read_excel(r'D:\EdgeDownloadPlace\3dd40612152202ee8440f82a3d277008\test.xlsx')
def get_data_array_float64(df,test=False):
df = df.drop(columns='uid')
#去列名对应的列
if test == True:
df=df.drop(columns ='target')
#去列名对应的列
col_mode_lst=[]
for each_col in df.columns:#获得每一列的众数
cnts = df[each_col].value_counts()
#得到每一列的所有值以及它们出现的次数 ,降序排列
if '?' in cnts and cnts.index[0] == '?':
idx=1
else :
idx=0
col_mode_lst.append(cnts.index[idx])
for i in range(len(df.columns)):
df[df.columns[i]][df[df.columns[i]] == '?'] = col_mode_lst[i]
#df[df.columns[i]]按照列名获得列
#按照列名获得列,找到列中值为‘?’的元素,将其改成col_mode_lst[i]
df_array = df.values.astype(np.float64)
#df.values得到DataFrame对象的矩阵形式
#,astype()方法为矩阵转化元素类型
return df_array
arr_t=get_data_array_float64(df_t)
arr_a=get_data_array_float64(df_a,True)
Xtrain, Xtest, Ytrain, Ytest = train_test_split(arr_t[:,:-1],arr_t[:,-1],test_size=0.3)
while True:
rfc=RandomForestClassifier(n_estimators=100
,criterion="entropy"
,max_depth=4
,min_samples_split=10)
#实例化随机森林
rfc = rfc.fit(Xtrain,Ytrain)
#训练模型
score = rfc.score(Xtest,Ytest)
#得到正确率
if score>0.84:
answer = rfc.predict(arr_a).astype(np.int8).tolist()
break
answer_df=pd.DataFrame(answer)
answer_df.to_excel(r'D:\EdgeDownloadPlace\3dd40612152202ee8440f82a3d277008\20201028ans.xlsx')