如何使用随机森林做出(是/否或 1-0)决定?
Posted
技术标签:
【中文标题】如何使用随机森林做出(是/否或 1-0)决定?【英文标题】:How to make (yes/no or 1-0) decisions with random forest? 【发布时间】:2017-10-03 06:53:14 【问题描述】:这是来自 Kaggle 的泰坦尼克号比赛的数据集(train 和 test csv 文件)。每个文件都有乘客的特征,如 ID、性别、年龄等。火车文件有一个“幸存”列,值为 0 和 1。测试文件缺少幸存的列,因为它必须被预测。 这是我使用随机森林为初学者提供基准的简单代码:
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
import random
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_curve, auc
train=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
train['Type']='Train' #Create a flag for Train and Test Data set
test['Type']='Test'
fullData = pd.concat([train,test],axis=0) #Combined both Train and Test Data set
ID_col = ['PassengerId']
target_col = ["Survived"]
cat_cols = ['Name','Ticket','Sex','Cabin','Embarked']
num_cols= ['Pclass','Age','SibSp','Parch','Fare']
other_col=['Type'] #Test and Train Data set identifier
num_cat_cols = num_cols+cat_cols # Combined numerical and Categorical variables
for var in num_cat_cols:
if fullData[var].isnull().any()==True:
fullData[var+'_NA']=fullData[var].isnull()*1
#Impute numerical missing values with mean
fullData[num_cols] = fullData[num_cols].fillna(fullData[num_cols].mean(),inplace=True)
#Impute categorical missing values with -9999
fullData[cat_cols] = fullData[cat_cols].fillna(value = -9999)
#create label encoders for categorical features
for var in cat_cols:
number = LabelEncoder()
fullData[var] = number.fit_transform(fullData[var].astype('str'))
train=fullData[fullData['Type']=='Train']
test=fullData[fullData['Type']=='Test']
train['is_train'] = np.random.uniform(0, 1, len(train)) <= .75
Train, Validate = train[train['is_train']==True], train[train['is_train']==False]
features=list(set(list(fullData.columns))-set(ID_col)-set(target_col)-set(other_col))
x_train = Train[list(features)].values
y_train = Train["Survived"].values
x_validate = Validate[list(features)].values
y_validate = Validate["Survived"].values
x_test=test[list(features)].values
Train[list(features)]
#*************************
from sklearn import tree
random.seed(100)
rf = RandomForestClassifier(n_estimators=1000)
rf.fit(x_train, y_train)
status = rf.predict_proba(x_validate)
fpr, tpr, _ = roc_curve(y_validate, status[:,1]) #metrics. added by me
roc_auc = auc(fpr, tpr)
print(roc_auc)
final_status = rf.predict_proba(x_test)
test["Survived2"]=final_status[:,1]
test['my prediction']=np.where(test.Survived2 > 0.6, 1, 0)
test
如您所见,final_status 给出了生存的概率。我想知道如何从中获得是/否(1 或 0)答案。我能想到的最简单的事情是说如果概率大于 0.6,那么这个人就活了下来,否则就死了(“我的预测”列),但是一旦我提交了结果,预测就一点也不好。
我很欣赏任何见解。谢谢
【问题讨论】:
能否提供给我们test.csv
和train.csv
以便我们运行代码?
Eric 它已经上传了。请看我帖子的第一行。只需下载它们,代码就可以运行了。谢谢
【参考方案1】:
将您的概率转换为二进制输出是正确的方法,但您为什么选择 > .6 而不是 > .5?
此外,如果您在这种情况下得到了不好的结果,很可能是因为您在数据清理和特征提取方面没有做好适当的工作。例如,标题(“先生”、“夫人”、...)可以告诉你性别,这是在你的问题中要考虑的一个非常重要的特征(我假设这是来自 kaggle 的巨大竞争)。
【讨论】:
谢谢。没错,它来自 Kaggle;实际上,我在帖子的第一行中已经承认了这一点。我尝试了 0.5、0.6、0.7 等,但没有一个是令人满意的。你是对的,它不是一个好的模型,但就像我在帖子中所说的那样,它应该为初学者提供一个快速的基准。关于将概率转换为二进制输出,有没有可以用来搜索和学习的关键字?像 Python 中有没有这样的函数,还是我需要写一个算法?【参考方案2】:我只需要使用这样的一行:
out = rf.predict(x_test)
这将是我正在寻找的 0/1 答案。
【讨论】:
以上是关于如何使用随机森林做出(是/否或 1-0)决定?的主要内容,如果未能解决你的问题,请参考以下文章