kaggle의 Titanic에 도전해 보았습니다.
15833 단어 scikit-learn파이썬MachineLearningKaggle
소개
머신러닝의 입문으로서 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위라는 결과였습니다.
적은 변수에 비해 어느 정도의 정밀도를 낼 수 있었다고 생각합니다.
그러나 다른 특징을 추가하거나 학습 모델에서 다른 알고리즘을 사용하는 등 개선점도 많이 있습니다.
근일에 다시 도전해보고 싶습니다.
Reference
이 문제에 관하여(kaggle의 Titanic에 도전해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Naruki/items/fd2dd0ee29c89cecc33e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
데이터 수
우선, 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위라는 결과였습니다.
적은 변수에 비해 어느 정도의 정밀도를 낼 수 있었다고 생각합니다.
그러나 다른 특징을 추가하거나 학습 모델에서 다른 알고리즘을 사용하는 등 개선점도 많이 있습니다.
근일에 다시 도전해보고 싶습니다.
Reference
이 문제에 관하여(kaggle의 Titanic에 도전해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Naruki/items/fd2dd0ee29c89cecc33e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# '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위라는 결과였습니다.
적은 변수에 비해 어느 정도의 정밀도를 낼 수 있었다고 생각합니다.
그러나 다른 특징을 추가하거나 학습 모델에서 다른 알고리즘을 사용하는 등 개선점도 많이 있습니다.
근일에 다시 도전해보고 싶습니다.
Reference
이 문제에 관하여(kaggle의 Titanic에 도전해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Naruki/items/fd2dd0ee29c89cecc33e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(kaggle의 Titanic에 도전해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Naruki/items/fd2dd0ee29c89cecc33e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)