入坑kaggle第四天- Titanic - Machine Learning from Disaster模型优化(进阶10%)

由于昨天毫无目标的调整参数, 很快用完了kaggle的十次提交机会。
以后, 需要有目标的提交, 防止浪费提交次数。

1 如何观察数据

1.1 通过四个方法, 观察数据

method 1:

import pandas as pd
df = pd.read_csv('titanic/train.csv')

入坑kaggle第四天- Titanic - Machine Learning from Disaster模型优化(进阶10%)
method 2:

df.shape

(891, 12)

method 3:

df.count()

PassengerId 891
Survived 891
Pclass 891
Name 891
Sex 891
Age 714
SibSp 891
Parch 891
Ticket 891
Fare 891
Cabin 204
Embarked 889
dtype: int64

Survived: label
features: 10 个
Pclass 891
Name 891
Sex 891
Age 714
SibSp 891
Parch 891
Ticket 891
Fare 891
Cabin 204
Embarked 889
method 4:
df.describe()
入坑kaggle第四天- Titanic - Machine Learning from Disaster模型优化(进阶10%)

本来认为, 有些feature是没用的, 比如, Name, 其实未必, 为了达到更高的分数,有必要分析。重要的如何充分的利用原始数据, 对没有的数据得到最好的预测, 比如如果有人问你的属相, 其实就是问你年龄, Age: 数据中只有714个, 但昨天的分析中, 是很重要的参数, 如何预测年龄, 如果取平均值, 未必是最好的结果, 但通过Name是可以预测的,总之一定要尽可能挖掘数据, 得到最多最可靠的数据, 才能得到理想的结果。Cabin是否可以数据补全, 也需要考虑。

2 确定模型

根据昨天的对比, 模型最好的是RandomForestClassifier

from sklearn.ensemble import RandomForestClassifier

def clean_data(data): # transform text to number for machine leaarning
    data['Fare'] = data['Fare'].fillna(data['Fare'].dropna().median())
    data['Age'] = data['Age'].fillna(data['Age'].dropna().median())
    
    data.loc[data['Sex'] == 'male', 'Sex'] = 0
    data.loc[data['Sex'] == 'female', 'Sex'] = 1
    
    data['Embarked'] = data['Embarked'].fillna('S') # if no data, fill with S
    data.loc[data['Embarked'] == 'S', 'Embarked'] = 0
    data.loc[data['Embarked'] == 'C', 'Embarked'] = 1
    data.loc[data['Embarked'] == 'Q', 'Embarked'] = 2
    
# clean data
clean_data(train_data)
clean_data(test_data)

# label
y = train_data["Survived"]
# features choose 5
features = train_data[['Pclass', 'Age', 'Sex', 'SibSp', 'Parch', "Fare", "Embarked"]].values
test_features = test_data[['Pclass', 'Age', 'Sex', 'SibSp', 'Parch', "Fare", "Embarked"]].values
model = RandomForestClassifier(n_estimators=50, max_depth=7, random_state=1)
model.fit(features, y)
predictions = model.predict(test_features)

output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")
print(model.score(features, y))

3 调整参数

n_estimators=50, max_depth=7为当前最佳
排名:1839
0.79186

4 当前主要问题

data['Fare'] = data['Fare'].fillna(data['Fare'].dropna().median())
data['Age'] = data['Age'].fillna(data['Age'].dropna().median())

对于未知的Fare和Age应该可以预测, 比如Pclass 为头等舱,Fare要高, 不能整体平均, Age, 可以根据name预测, 比如Mrs应该比Miss年龄更大。
没有对过拟合做处理。

关于模型参数调整, 没有必要过多的调整参数。

上一篇:mongoDB的常用指令


下一篇:第2次作业-titanic数据集练习