由于昨天毫无目标的调整参数, 很快用完了kaggle的十次提交机会。
以后, 需要有目标的提交, 防止浪费提交次数。
1 如何观察数据
1.1 通过四个方法, 观察数据
method 1:
import pandas as pd
df = pd.read_csv('titanic/train.csv')
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()
本来认为, 有些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年龄更大。
没有对过拟合做处理。
关于模型参数调整, 没有必要过多的调整参数。