1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| """titanic.py - Kaggle Titanic 生存预测""" import pandas as pd import numpy as np from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.preprocessing import LabelEncoder
train = pd.read_csv('train.csv') test = pd.read_csv('test.csv') ids = test['PassengerId']
all_data = pd.concat([train, test], keys=['train', 'test'], names=['source']).reset_index(level='source')
all_data['Age'] = all_data.groupby(['Sex', 'Pclass'])['Age'].transform(lambda x: x.fillna(x.median())) all_data['Embarked'] = all_data['Embarked'].fillna('S') all_data['Fare'] = all_data['Fare'].fillna(all_data['Fare'].median()) all_data['FamilySize'] = all_data['SibSp'] + all_data['Parch'] + 1 all_data['IsAlone'] = (all_data['FamilySize'] == 1).astype(int) all_data['Title'] = all_data['Name'].str.extract(r'([A-Za-z]+)\.', expand=False) rare = ['Lady', 'Countess','Capt', 'Col','Don', 'Dr','Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'] all_data['Title'] = all_data['Title'].replace(rare, 'Rare') all_data['Title'] = all_data['Title'].replace({'Mlle':'Miss', 'Ms':'Miss', 'Mme':'Mrs'}) all_data['AgeBin'] = pd.cut(all_data['Age'], bins=[0,12,30,50,80], labels=['Child','Young','Middle','Elderly']) all_data['FareBin'] = pd.qcut(all_data['Fare'], 4, labels=['Low','Medium','High','VeryHigh'])
for col in ['Sex', 'Title', 'AgeBin', 'FareBin', 'Embarked']: all_data[col] = LabelEncoder().fit_transform(all_data[col].astype(str))
features = ['Pclass','Sex','Age','Fare','Embarked','FamilySize','IsAlone','Title','AgeBin','FareBin'] X_train = all_data[all_data['source']=='train'][features] y_train = train['Survived'] X_test = all_data[all_data['source']=='test'][features]
model = VotingClassifier([ ('lr', LogisticRegression(max_iter=1000)), ('rf', RandomForestClassifier(n_estimators=200, random_state=42)), ('gb', GradientBoostingClassifier(n_estimators=200, random_state=42)), ], voting='soft') model.fit(X_train, y_train)
preds = model.predict(X_test) pd.DataFrame({'PassengerId': ids, 'Survived': preds}).to_csv('submission.csv', index=False) print("submission.csv created ✅")
|