【Kaggle挑戦記】S4E11 #2:ノイズを削って精度を出す。名前(Name)削除の劇的ビフォーアフター
前回、予測の重要度ランキングで「Name(名前)」が1位という、エンジニアとして看過できない「仕様バグ」に近い状態に直面しました。 今回はこの不適切な依存関係を排除し、コードをリファクタリングして再挑戦した結果を報告します。
1. 実装:不要な依存関係を排除した「クリーン」なモデル
「名前で予測する」というハードコーディングに近い過学習を防ぐため、物理的にカラムをドロップしました。 また、コンペの締め切り後(After Deadline)でも確実に評価を通すため、型変換と出力を最適化した「修正版コード」を投入しました。
import pandas as pd
import lightgbm as lgb
from sklearn.preprocessing import LabelEncoder
# 1. データの読み込み
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# 2. 前処理:ターゲットの数値化
le = LabelEncoder()
if train['Depression'].dtype == 'object':
train['Depression'] = le.fit_transform(train['Depression'])
# 3. 特徴量の選択(「名前」を明示的にドロップ!)
drop_cols = ['id', 'Name']
X = train.drop(drop_cols + ['Depression'], axis=1)
y = train['Depression']
X_test = test.drop(drop_cols, axis=1)
# 4. カテゴリ変数の処理(LightGBM用)
cat_cols = X.select_dtypes(include=['object']).columns.tolist()
for col in cat_cols:
X[col] = X[col].astype('category')
X_test[col] = X_test[col].astype('category')
# 5. モデルの構築
params = {
'objective': 'binary',
'metric': 'binary_error',
'verbosity': -1,
'random_state': 42
}
model = lgb.LGBMClassifier(**params)
model.fit(X, y)
# 6. 予測と提出ファイルの作成
submission = pd.DataFrame({
'id': test['id'],
'Depression': model.predict(X_test)
})
submission['Depression'] = submission['Depression'].astype(int)
submission.to_csv('submission_final.csv', index=False)
2. コンソール出力:健全なランキングへの変遷
実行後、コンソールに表示されたランキングは、前回とは全く異なる「納得感」のある顔ぶれになりました。 可読性のために標準的なログスタイルで出力結果を記載します。
--- Submission file created successfully! ---
feature importance
2 City 494
12 Degree 388
4 Profession 359
1 Age 315
15 Financial Stress 224
feature importance
2 City 494
12 Degree 388
4 Profession 359
1 Age 315
15 Financial Stress 224
3. スコア:ノイズを消して「実力」が向上
締め切り後(After Deadline)のLate Submissionですが、結果は意外なものでした。 名前を消したことで、むしろスコアが上昇したのです。
| 指標 | 前回(Nameあり) | 今回(Nameなし) |
|---|---|---|
| Public Score | 0.94008 | 0.94152 (↑) |
| Private Score | 0.93868 | 0.93961 (↑) |
4. 考察とまとめ
「名前」という強力なノイズがモデルを惑わせていたことが、スコアの向上によって証明されました。 不要なカラムを削除したことで、モデルが「City(都市)」や「Degree(学位)」といった、メンタルヘルスに真に影響を与えるコンテキストに集中できるようになった結果です。
「なぜ動くか分からないコード」を放置せず、違和感のある変数を削ぎ落とす。 バックエンドのデバッグと同じ姿勢で取り組むことが、Kaggleにおける精度向上にも直結することを実感した一戦でした。
Kaggleの履歴に「After Deadline」と「Error」のログが残ることは、試行錯誤の証。 次の「本物のコンペ」では、このデバッグの知見を最初からぶつけていきたいと思います。
PR