도전3
7745 단어 Python3
앞서 쓴 기사에서 도출된 가설
• PaseengerId 를 제거하는 것이 좋을 것 같다
· Family Size에 가입하는 것이 더 좋을 것 같습니다
・Parch, SibSp가 0인 사람은 Survived율이 비교적 낮을 수 있다
・0~10세 생존자가 많을 수 있음
라고 적었다.이 가설을 검증하다
1, 처리 함수화
이번 처리는 그다지 크지 않다
・훈련 데이터와 테스트 데이터의 예처리 함수
・훈련 데이터를 평가하는 함수
・테스트 데이터 예측용 함수
・출력 특징량의 중요도
의 4개 함수화
소스 코드는 다음과 같습니다.
%matplotlib inline
import warnings
import numpy as np
import pandas as pd
import xgboost as xgb
import matplotlib.pylab as plt
from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
warnings.filterwarnings('ignore')
def validate(train_x, train_y):
accuracies = []
feature_importances = []
cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=0)
for train_idx, test_idx in cv.split(train_x, train_y):
trn_x = train_x.iloc[train_idx, :]
val_x = train_x.iloc[test_idx, :]
trn_y = train_y.iloc[train_idx]
val_y = train_y.iloc[test_idx]
clf = xgb.XGBClassifier()
clf.fit(trn_x, trn_y)
pred_y = clf.predict(val_x)
feature_importances.append(clf.feature_importances_)
accuracies.append(accuracy_score(val_y, pred_y))
print(np.mean(accuracies))
return accuracies, feature_importances
def plot_feature_importances(feature_importances, cols):
df_fimp = pd.DataFrame(feature_importances, columns=cols)
df_fimp.plot(kind="box", rot=90)
def preprocess_df(df):
# CabinはこのあとDropするので、コードから削除
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode())
# 列の削除
df.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
# Sexの01化とEmbarkedのダミー化
df["Sex"] = df["Sex"].replace({"male": 0, "female": 1})
df = pd.get_dummies(df)
return df
# test dataのpredict
def predict_df(train_x, train_y, test_x, df_test_raw, path_output="result.csv"):
clf = xgb.XGBClassifier()
clf.fit(train_x, train_y)
preds = clf.predict(test_x)
_df = pd.DataFrame()
_df["PassengerId"] = df_test_raw["PassengerId"]
_df["Survived"] = preds
_df.to_csv(path_output, index=False)
# デバッグするときはmain関数から外して、直で叩く方が楽です。
def main():
df_train = pd.read_csv("train.csv")
# ここは前処理
train_y = df_train["Survived"]
train_x = df_train.drop("Survived", axis=1)
train_x = preprocess_df(train_x)
accuracies, feature_importances = validate(train_x, train_y)
plot_feature_importances(feature_importances, train_x.columns)
flag_product = True
if flag_product:
df_test = pd.read_csv("test.csv")
df_test_raw = df_test.copy()
test_x = preprocess_df(df_test)
predict_df(train_x, train_y, test_x, df_test_raw, "result.csv")
# `if __name__ == '__main__':` はおまじないのようなモノと思ってください。
if __name__ == '__main__':
main()
결실0.8103254769921436
유효성 검사 1, PassengerId 제외
열 df를 제거해야 합니다.drop(열명, axis=1, inplace=True)은 OK
def preprocess_df(df):
# CabinはこのあとDropするので、コードから削除
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode())
# 列の削除
df.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1, inplace=True)
# Sexの01化とEmbarkedのダミー化
df["Sex"] = df["Sex"].replace({"male": 0, "female": 1})
df = pd.get_dummies(df)
return df
if __name__ == '__main__':
main()
결실0.8226711560044894
cv의 값 상승을 확인할 수 있습니다
2, 가설 검증 - Family Size 열 제작
이어서 SibSp와 Parch의 수를 더해서 Family Size라는 열을 만들겠습니다.
preprocess_df 내용만 바꾸면 ok
def preprocess_df(df):
# CabinはこのあとDropするので、コードから削除
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode())
df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
# 列の削除
df.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1, inplace=True)
# Sexの01化とEmbarkedのダミー化
df["Sex"] = df["Sex"].replace({"male": 0, "female": 1})
df = pd.get_dummies(df)
return df
if __name__ == '__main__':
main()
결실0.8237934904601572
cv의 평균치가 상승한 것을 알 수 있다
3Parch, SibSp가 0인 깃발을 세우다
Parch, SibSp가 0 인 깃발을 세우다
아까 Family Size라는 변수도 했어요. 이 값이 1인 사람도 로고를 따로 만들어 봤어요.
def preprocess_df(df):
# CabinはこのあとDropするので、コードから削除
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode())
df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
# 列の削除
df.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1, inplace=True)
# Sexの01化とEmbarkedのダミー化
df["Sex"] = df["Sex"].replace({"male": 0, "female": 1})
df = pd.get_dummies(df)
# Parch, SibSp, FamilySize関連のFlag
df["None_Parch"] = [1 if val == 0 else 0 for val in df["Parch"]]
df["None_SibSp"] = [1 if val == 0 else 0 for val in df["SibSp"]]
df["None_Family"] = [1 if val == 1 else 0 for val in df["FamilySize"]]
return df
if __name__ == '__main__':
main()
결실0.819304152637486
특징량으로서의 중요도도 0이어서 전혀 사용하지 않았음을 알 수 있다.이번에는 이것들을 특징량에 넣지 마세요.
4、0~10세의 생존자가 많을 수 있다
def preprocess_df(df):
# CabinはこのあとDropするので、コードから削除
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode())
df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
# 列の削除
df.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1, inplace=True)
# Sexの01化とEmbarkedのダミー化
df["Sex"] = df["Sex"].replace({"male": 0, "female": 1})
df = pd.get_dummies(df)
# Parch, SibSp, FamilySize関連のFlag
df["Flag_Children"] = [1 if val < 11 else 0 for val in df["Age"]]
return df
if __name__ == '__main__':
main()
결실0.819304152637486
이번에는 이것도 특징량에 넣지 마세요.
근거
PassengerId를 빼는 게 좋을지도 몰라, Family사이즈를 넣었으면 좋겠어요.
(실제로 교차 계산에서 얻은 값과 실제 점수가 일치하지는 않는다. 이번 경우라면 패밀리 사이즈를 넣어 계산한 값이 Submit이면 점수가 조금 떨어진다.)
Reference
이 문제에 관하여(도전3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bestfitat/items/9c4bec37778a3ce6077c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)