kaggle의 Titanic에 도전해 보았습니다.

소개



머신러닝의 입문으로서 kaggle의 Titanic에 도전해 보았습니다.
이 대회는 1912년에 일어난 타이타닉호 침몰 사건에 대해 승객의 나이나 성별 등에서 생사를 예측하는 분류 문제입니다.
이번 분석에 사용한 코드는 Titanic 코드 에 실려 있습니다.

데이터 개요



데이터 수



우선, train, test의 데이터수를 각각 확인합니다.
# trainデータ
print(train.shape)
# testデータ
print(test.shape)
(891, 12)
(418, 11)

train 데이터는 test 데이터의 약 2배의 데이터 수가 있고 설명 변수는 11개 있다는 것을 알았습니다.
다음으로 설명 변수에 대해 살펴보고 싶습니다.

변수 확인


# 全変数を確認
train.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

모든 변수를 출력해 보았습니다. 각각에 대해 대회 사이트의 설명을 보면 다음과 같이 되어 있습니다.



변수 이름
설명


1
PassengerId
승객 ID

2
Pclass
티켓 클래스

3
이름
이름

4
Sex
성별

5
Age
나이

6
SibSp
함께 승선하는 형제·부부의 수

7
Parch
함께 승선하는 아이와 부모의 수

8
티켓
티켓 번호

9
Fare
승선요금

10
Cabin
객실

11
Embarked
승선한 항구(C:Cherbourg, Q:Queenstown, S:Southampton)

12
Survived
생사(목적 변수)


누락 값 확인


# trainデータの欠損値
train.isnull().sum()[train.isnull().sum()>0]
Age         177
Cabin       687
Embarked      2
dtype: int64
# testデータの欠損値
test.isnull().sum()[test.isnull().sum()>0]
Age       86
Fare       1
Cabin    327
dtype: int64

목적 변수 분포





학습 데이터에서 죽은 사람은 생존자의 약 1.5배에 가깝습니다.
따라서 생존자를 어떻게 찾아내는가가 분석의 열쇠가 될 것입니다.

설명 변수별 분포



성별(Sex)




남녀별로 목적 변수와의 관계를 시각화했습니다.
여성이 남성보다 생존율이 높다는 것을 알 수 있습니다.
남녀로 더미 변수화하는 것이 좋을 것 같습니다.

나이(Age)




연령을 빈 나누어 목적 변수와의 관계를 시각화했습니다.
0~10세까지는 생존율이 높은 반면 70세 이상에서는 크게 생존율이 저하하고 있습니다.
0~10, 10~70, 70~100으로 매핑하는 것이 좋을 것 같습니다.

가족(family)




'SibSp'와 'Parch'라는 변수는 합치면 kanngae, 'family'라는 변수를 만들었습니다.
혼자 타는 사람의 생존율은 낮은 것 같습니다.

티켓 클래스(Pclass)




티켓 클래스와 목적 변수 간의 관계를 시각화했습니다.
클래스가 낮은 3의 티켓을 가진 사람은 생존율이 낮은 것 같습니다.
클래스 1, 2와 클래스 3으로 매핑하는 것이 좋을 것 같습니다.

전처리



데이터의 시각화를 바탕으로, 전처리를 실시했습니다.
# 'Sex'をマッピング
sex_mapping = {'male':0, 'female':1}
train['Sex'] = train['Sex'].map(sex_mapping)
test['Sex'] = test['Sex'].map(sex_mapping)

# 'Age'の欠損値を平均値補完
train['Age'] = train['Age'].fillna(train['Age'].mean())
test['Age'] = test['Age'].fillna(test['Age'].mean())

def age(x):
    if x < 10:
        x = 0
    elif x < 20:
        x = 1
    elif x < 30:
        x = 1
    elif x < 40:
        x = 1
    elif x < 50:
        x = 1
    elif x < 60:
        x = 1
    else:
        x = 2
    return x

train['Age'] = train['Age'].apply(age)
test['Age'] = test['Age'].apply(age)
# 'family'という特徴量を新たに作成
train['family'] = train['SibSp'] + train['Parch']
test['family'] = test['SibSp'] + test['Parch']

# 'Pclass'をマッピング
def pclass(x):
    if x <=2:
        x = 0
    else:
        x = 1
    return x

train['Pclass'] = train['Pclass'].apply(pclass)
test['Pclass'] = test['Pclass'].apply(pclass)

test['Fare'] = test['Fare'].fillna(test['Fare'].mean())

데이터 검색, 표준화, 그리드 검색, 학습



특징량은 4개를 사용해 표준화를 실시했습니다.
# X, yにデータを代入
X = train.loc[:, ['Sex', 'Age', 'family', 'Pclass']].values
y = train.loc[:, ['Survived']].values.reshape(-1)

# データの標準化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

또한 SVM을 사용하여 최상의 매개 변수 조합을 그리드 검색에서 찾습니다.
# データの分割方法を指定(層化)
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
# 調整したいパラメータを指定
param_grid = {'C': [0.1, 1.0, 10, 100, 1000, 10000],
              'gamma': [0.001, 0.01, 0.1, 1, 10]}
# GridSearchCVのインスタンスを生成
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# モデルのインスタンス, 試したいパラメータの値, 分割方法
gs_svc = GridSearchCV(SVC(), param_grid, cv=kf)
# 学習
gs_svc.fit(X_std, y)

결과·정리·반성



학습 모델을 사용하여 예측한 결과, 3346/9755위라는 결과였습니다.
적은 변수에 비해 어느 정도의 정밀도를 낼 수 있었다고 생각합니다.
그러나 다른 특징을 추가하거나 학습 모델에서 다른 알고리즘을 사용하는 등 개선점도 많이 있습니다.
근일에 다시 도전해보고 싶습니다.

좋은 웹페이지 즐겨찾기