2017-05-04 8 views
1

Kaggleのタイタニックコンクール(trainおよびtest csvファイル)のデータセットです。各ファイルには、ID、性別、年齢などの乗客の特徴があります。列車ファイルには、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

エリックはすでにアップロードされています。私のポストの最初の行を見てください。ダウンロードするだけで、コードは実行準備が整いました。ありがとう – user3709260

答えて

0

あなたの確率をバイナリ出力に変換するのが正しい方法ですが、> .6ではなく> .5を選択したのはなぜですか?

また、この場合に結果が悪い場合は、データのクリーニングと機能抽出で適切な仕事をしなかった可能性が高いです。たとえば、タイトル(「Mr」、「Mrs」、...)は、あなたの問題で考慮すべき非常に重要な機能であるジェンダーの表示を与えることができます(これはかぶりとの大規模な競争です)。

+0

ありがとう。あなたはKaggleのものです。私は実際に私のポストの最初の行でそれを認めました。 私は.5、.6、.7などを試みましたが、どれも満足できませんでした。あなたはそれが良いモデルではないことは間違いないが、私が記事で言ったように、それはスターターのためのちょっとしたベンチマークを提供することになっている。 確率をバイナリ出力に変換することに関して、検索や学習に使用できるキーワードはありますか? Pythonの関数があるか、アルゴリズムを書く必要がありますか? – user3709260

0

私だけのような行を使用するために必要な:

out = rf.predict(x_test) 

、それは私が探していた0/1の答えだろう。

関連する問題