2017-05-04 36 views
1

這是來自Kaggle的泰坦尼克號競賽的數據集(traintest csv文件)。每個文件都具有乘客的特徵,例如身份證,性別,年齡等。火車文件具有0和1值的「存活」列。測試文件缺少存活列,因爲它必須被預測。 這是我使用隨機森林給我一個標杆首發簡單的代碼:如何製作(是/否或1-0)隨機森林決策?

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,那麼這個人倖存下來並以其他方式死亡(「我的預測」專欄),但是一旦我提交了結果,預測就根本不好。

我很欣賞任何見解。謝謝

+0

您能否向我們提供'test.csv'和'train.csv',以便我們可以運行代碼? –

+0

Eric已經上傳了。請參閱我的文章的第一行。只需下載它們,代碼即可運行。謝謝 – user3709260

回答

0

將概率轉換爲二進制輸出是正確的選擇,但爲什麼選擇> .6而不是> .5?

另外,如果在這種情況下結果不好,很可能是因爲您沒有在數據清理和特徵提取方面做適當的工作。例如,標題(「先生」,「太太」,...)可以給你的性別,這是你的問題要考慮一個超級重要的功能指示(我想這是從kaggle泰坦尼克競爭)。

+0

謝謝。你說得對,它來自Kaggle;我已經在我的帖子的第一行中確認了這一點。 我試過.5,.6,.7等,但都​​沒有令人滿意。你說得對,它不是一個好的模型,但正如我在帖子中所說的那樣,它應該爲初學者提供一個快速的基準。 關於將概率轉換爲二進制輸出,有沒有我可以用來搜索和學習的關鍵字?像Python中是否有函數,或者我需要編寫一個算法? – user3709260

0

我只需要使用這樣一行:

out = rf.predict(x_test) 

,這將是0/1的答案我一直在尋找。