前回、前々回と初心に帰りタイタニックをやっていたわけですが(転職活動長引きすぎてスキルが理由なのか不安になっていたわけですが)どうもサンプルの提出物の精度を超えませんでした。
最初にやったのは欠損値を大真面目に考えたこと
そして次には名前の敬称を特徴量としたわけですが、
どれも良くて75%でした。(検証用データは90%近くなのに)
そこで今度は使用する学習アルゴリズムを決定木系ではなくSVMを使ってみました。
初期値なのでRBFカーネル(ガウスカーネル)である程度ソフトマージンなのかな?
コード
変数選択用
元々変数選択をしようとしたのでそれ用のコードを書きました。
x2 = x
x_te2 = x_test
続いてSVMは決定木系のアルゴリズムではないので前処理として標準化が必要ですので、行います。
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(x2)
x2 = ss.transform(x2)
models = []
for i in range(200):
x_train, x_val, y_train, y_val = tts(x2, y, random_state=i, test_size=0.2, stratify=y)
model1 = RFC()
model1.fit(x_train, y_train)
models.append([model1, model1.score(x_val, y_val), model1.score(x_train, y_train)])
model2 = LGBMC()
model2.fit(x_train, y_train)
models.append([model2, model2.score(x_val, y_val), model2.score(x_train, y_train)])
model3 = SVC()
model3.fit(x_train, y_train)
models.append([model3, model3.score(x_val, y_val), model3.score(x_train, y_train)])
models = sorted(models, key=lambda x:x[1], reverse=True)
SVMが最も精度が高くなりました(LightGBMよりも)。
ではこれで予測をしてみましょう。
from scipy.stats import mode
x_te2 = ss.transform(x_te2)
y_pred1 = models[0][0].predict(x_te2)
y_pred2 = models[1][0].predict(x_te2)
y_pred3 = models[2][0].predict(x_te2)
y_pred = []
for i in range(len(y_pred1)):
y_pred.append(mode([y_pred1[i], y_pred2[i], y_pred3[i]])[0])
pred = pd.DataFrame(y_pred1)
pred.columns = ["Survived"]
pred.index = x_test.index
pred.sort_index().to_csv("submit_allval11.csv")
これで提出した結果がこちらになります。
ようやくこれでサンプルの提出物の精度を超えました。
しかし何が原因だったんだろう。