In [88]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import seaborn as sns
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
In [115]:
train = pd.read_csv('train.csv')
y = train['Survived']
del train['Survived']
train.head()
Out[115]:
In [57]:
train.shape
Out[57]:
In [116]:
test = pd.read_csv('test.csv')
test.head()
Out[116]:
In [59]:
test.shape
Out[59]:
Проведем краткое исследование данных, построим бейзлайн, результаты которого попытаемся улучшить
In [129]:
data = pd.concat([train, test], ignore_index = True)
data.head()
Out[129]:
In [64]:
data.describe()
Out[64]:
In [65]:
data.isnull().sum()
Out[65]:
Пропущенные данные в графе возраст заменим медианой, данные в графе с номером кабины практически отсутствуют, удалим его, пропущенные данные в графе порт посадки заменим на наиболее часто встречающиеся значение
In [130]:
data['Age'] = data['Age'].fillna(np.median(data['Age'].loc[(data['Age'].isnull()== False)]))
In [131]:
data['Embarked'].value_counts()
Out[131]:
In [132]:
data['Embarked'] = data['Embarked'].fillna('S')
del data['Cabin']
In [133]:
data.Pclass.loc[data['Fare'].isnull()]
Out[133]:
Пасажир для которого пропущено значение цены его билета был в третьем классе, заполним это значение медианой цен на билеты в третьем классе
In [134]:
data['Fare'] = data['Fare'].fillna(np.median(data.Fare[data.Pclass == 3][np.isnan(data.Fare)==False]))
In [71]:
data.isnull().sum()
Out[71]:
Закодируем категориальные перменные, исследуем признак 'Name' и получим датасет для получения базовой линии, которую мы будем пытаться превзойти
In [72]:
f, ax = plt.subplots(figsize=(8, 8))
sns.barplot(
ax=ax,
x='Pclass',
y=y,
hue='Sex',
data=train,
capsize=0.05
)
ax.set_title("Survival By Gender and Ticket Class")
ax.set_ylabel("Survival (%)")
ax.set_xlabel("")
ax.set_xticklabels(["First Class", "Second Class", "Third Class"])
plt.show()
В первую очердь на спасали женьщин, также спаслась большая доля мужчин из первого класса (скорее всего обеспеченных)
In [37]:
train.Name
Out[37]:
Длина имени во времена Титаника часто указывала на высокое происхождение, что часто связано с достатком, а так как достаток влияет на вероятность выжить, то создадим новый признак - число символов в имени
In [135]:
data['name_len'] = data['Name'].apply(len)
data['name_len']
Out[135]:
In [136]:
label_enc = LabelEncoder()
data.Sex = label_enc.fit_transform(data.Sex)
In [137]:
data.Embarked = label_enc.fit_transform(data.Embarked)
удалим данные которые не будем использовать на данном этапк: PassengerId, Name, Ticket
In [138]:
train_2 = data.ix[0:890]
del train_2['Name']
del train_2['Ticket']
train_2.head()
Out[138]:
In [140]:
test_2 = data.ix[891:]
del test_2['Name']
del test_2['Ticket']
Out[140]:
In [141]:
test_2
Out[141]:
Можно предположить, что давольно хороший результат нам даст рандомфорест, используем его для построения базовый линии
In [142]:
X_train, X_test, y_train, y_test = train_test_split(train_2, y, test_size=0.25, random_state=42)
In [96]:
forest = RandomForestClassifier()
params = {
'n_estimators':[100,300,500,700,900],
'criterion': ('gini','entropy'),
'max_features': (5,6,7,8,9,'auto', 'log2'),
'max_depth': (None, 50,40,30,20,10),
}
forest_grid = GridSearchCV(forest, params)
forest_grid.fit(X_train, y_train)
Out[96]:
In [97]:
forest_grid.best_estimator_
Out[97]:
In [98]:
forest_grid.best_score_
Out[98]:
In [99]:
y_pred = forest_grid.best_estimator_.predict(X_test)
In [100]:
accuracy_score(y_test, y_pred)
Out[100]:
переобучим лучший классификатора на полном объеме данных
In [143]:
best_forest = RandomForestClassifier(bootstrap=True, class_weight=None, criterion='entropy',
max_depth=50, max_features=9, max_leaf_nodes=None,
min_impurity_split=1e-07, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
n_estimators=300, n_jobs=1, oob_score=False, random_state=42,
verbose=0, warm_start=False)
best_forest.fit(train_2,y)
Out[143]:
In [144]:
y_pred = best_forest.predict(test_2)
In [ ]:
In [148]:
sub_samp = pd.read_csv('gender_submission.csv')
sub_samp
Out[148]:
In [149]:
sub_samp.Survived = y_pred
sub_samp
Out[149]:
In [153]:
sub_samp.to_csv('baseline_sub.csv', index = False) # 0.76077
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [29]:
f, ax = plt.subplots(figsize=(8, 8))
sns.barplot(
ax=ax,
x='Embarked',
y='Survived',
hue='Sex',
data=train,
capsize=0.05
)
ax.set_title("Survival by port of Embarction ")
ax.set_ylabel("Survival (%)")
ax.set_xlabel("")
ax.set_xticklabels(["C", "Q", "S"])
plt.show()
Выживших из Queenstown заметно больше. Сравним распределния стоимости билетов в этих городах.
In [49]:
f, ax = plt.subplots(figsize=(8, 8))
sns.barplot(
ax=ax,
x='Embarked',
y='Survived',
hue='Pclass',
data=train,
capsize=0.05
)
ax.set_title("Survival by port of Embarction and class of ticket")
ax.set_ylabel("Survival (%)")
ax.set_xlabel("")
ax.set_xticklabels(["C", "Q", "S"])
plt.show()
In [65]:
print ('1st class passengers from Cherbourg:'+ str(len(train['Fare'][train['Embarked']=='C'][train['Pclass']==1])))
print ('1st class passengers from Queenstown :'+ str(len(train['Fare'][train['Embarked']=='Q'][train['Pclass']==1])))
print ('1st class passengers from Southampton :'+ str(len(train['Fare'][train['Embarked']=='S'][train['Pclass']==1])))
print ('2nd class passengers from Cherbourg:'+ str(len(train['Fare'][train['Embarked']=='C'][train['Pclass']==2])))
print ('2nd class passengers from Queenstown :'+ str(len(train['Fare'][train['Embarked']=='Q'][train['Pclass']==2])))
print ('2nd class passengers from Southampton :'+ str(len(train['Fare'][train['Embarked']=='S'][train['Pclass']==2])))
Закодируем категориальные признаки
In [25]:
train.columns
Out[25]:
Кодировать графу имя бессымысленно, однако в списке
In [ ]:
train_cat = train[['Pclass']]