Skip to content

Instantly share code, notes, and snippets.

@inoccu
Last active May 16, 2023 06:31
Show Gist options
  • Save inoccu/f21d7c353768c5fad2b49afee7a83d61 to your computer and use it in GitHub Desktop.
Save inoccu/f21d7c353768c5fad2b49afee7a83d61 to your computer and use it in GitHub Desktop.
Kaggleで学ぶ!機械学習エンジニア入門

Kaggleで学ぶ!機械学習エンジニア入門

Pandasによるデータの可視化と前処理

(1)データの読み込みと表示

df = pd.read_csv('/kaggle/input/titanic/train.csv')
df.head()

(2)データの形状と列名の取得

print('shape:', df.shape)
print('columns:', df.columns)

(3)列名を指定したデータの取得

df[['PassengerId', 'Survived']]

(4)条件を指定したデータの取得

df[['PassengerId', 'Survived', 'Fare']].query('Fare > 10')
df[df['Fare'] > 10][['PassengerId', 'Survived', 'Fare']]

(5)indexを指定したデータの取得

df[['PassengerId', 'Survived']].loc[880:885]

(6)グルーピングと統計計算

df[['Pclass', 'Fare']].groupby(['Pclass']).mean()

(7)基本統計量を見る

df.describe()

(8)量的データに絞り込んで基本統計量を見る

df[['Age', 'SibSp', 'Parch', 'Fare']].describe()

(9)カテゴリデータ(質的データ)の値の種類を見る

print(df['Pclass'].unique())
print(type(df['Pclass']))

(10)欠損値の確認

df.isnull().sum()

(11)欠損値のある行の削除

print('df count:', df[['PassengerId']].count())
df_a = df.dropna()
print('df_a count:', df_a[['PassengerId']].count())

(12)欠損値の補完

df_b = df.fillna({'Age': df['Age'].median(), 'Cabin': 'NA'})
df_b.tail()

(13)欠損値を補完したデータの保存

df_b.to_csv('./train_fillna.csv')

データの可視化

%matplotlib inline

from matplotlib import pyplot as plt
import seaborn

乗客年齢のヒストグラム

df['Age'].hist()

チケットクラスの棒グラフ

pclass_df = df[['Pclass', 'PassengerId']].groupby(['Pclass']).count()
pclass_df
pclass_df.plot.bar()

チケットクラスと生存の関係を可視化する(1)

pclass_df = df[['Pclass', 'Survived', 'PassengerId']].groupby(['Pclass', 'Survived']).count()
pclass_df
pclass_df = pclass_df.unstack()
pclass_df

チケットクラスと生存の関係を可視化する(1)

pclass_df.plot.bar(stacked=True)

年代と生存の関係を可視化する

plt.hist(
    [df[df['Survived'] == 0]['Age'].values,
     df[df['Survived'] == 1]['Age'].values],
    histtype='barstacked', bins=8, label=['Death', 'Survive']
)
plt.legend()

チケットクラスと生存の相関係数を求める

df[['Pclass', 'Survived']].corr()

相関行列の作成(1)

import seaborn as sns
sns.heatmap(df.corr(), annot=True)

カテゴリ変数のダミー変数化

df2 = pd.get_dummies(df[['Sex', 'Embarked']])
df2

DataFrameの結合と不要な列の削除

df3 = pd.concat([
    df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Sex', 'Embarked'], axis=1),
    df2.drop(['Sex_female'], axis=1)
], axis=1)
df3

相関行列の作成(2)

plt.figure(figsize=(9,9))
sns.heatmap(df3.corr(), annot=True)

LabelEncoderの使用

from sklearn.preprocessing import LabelEncoder

df4 = df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)

for category in ['Sex', 'Embarked']:
    le = LabelEncoder()
    le.fit(df4[category])
    
    df4[category] = le.transform(df4[category])

df4

相関行列の作成(3)

plt.figure(figsize=(9,9))
sns.heatmap(df4.corr(), annot=True)

scikit-learnによる分類モデルの作成

トレーニングデータ、バリデーションデータの分割

from sklearn.model_selection import train_test_split

X = df4.drop('Survived', axis=1).values
y = df4['Survived'].values

X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, random_state=0)

モデルのトレーニング

from xgboost import XGBClassifier

model = XGBClassifier(n_estimators=5, eval_metric='logloss')
model.fit(X_train, y_train)

バリデーションデータによる評価

model.score(X_valid, y_valid)

予測の実行

pred = model.predict(X_valid)
pred
pred_proba = model.predict_proba(X_valid)
pred_proba

予測結果を用いた精度の評価

from sklearn.metrics import accuracy_score, log_loss

print('accuracy:', accuracy_score(y_valid, pred))
print('logloss:', log_loss(y_valid, pred_proba))

交差検証法の実装

from sklearn.model_selection import KFold
import numpy as np

X = df4.drop(['Survived'], axis=1)
y = df4['Survived']

kf = KFold(n_splits=5, shuffle=True, random_state=0)
scores = []

for train_idx, valid_idx in kf.split(X):
    X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]
    y_train, y_valid = y.iloc[train_idx], y.iloc[valid_idx]

    model = XGBClassifier(n_estimators=5, eval_metric='logloss')
    model.fit(X_train, y_train)

    pred_proba = model.predict_proba(X_valid)
    logloss = log_loss(y_valid, pred_proba)
    print('logloss:', logloss)
    scores.append(logloss)
    
print(model)
print('total logloss:', np.mean(scores))

ハイパーパラメータの自動調整

from sklearn.model_selection import GridSearchCV

X = df4.drop(['Survived'], axis=1).values
y = df4['Survived'].values

model = XGBClassifier(eval_metric='logloss')
model_cv = GridSearchCV(
    model, 
    {'max_depth': [4,6,8], 
     'n_estimators': [3,5,10], 
     'learning_rate': [0.2,0.3,0.4]}, 
    cv=5, verbose=1)
model_cv.fit(X, y)

print(model_cv.best_params_, model_cv.best_score_)

自動調整したハイパーパラメータでモデルのトレーニング

X = df4.drop(['Survived'], axis=1)
y = df4['Survived']

kf = KFold(n_splits=5, shuffle=True, random_state=0)
scores = []
models = []

for train_idx, valid_idx in kf.split(X):
    X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]
    y_train, y_valid = y.iloc[train_idx], y.iloc[valid_idx]

    model = XGBClassifier(learning_rate=0.4, max_depth=8, n_estimators=10, eval_metric='logloss')
    model.fit(X_train, y_train)
    models.append(model)

    pred_proba = model.predict_proba(X_valid)
    logloss = log_loss(y_valid, pred_proba)
    print('logloss:', logloss)
    scores.append(logloss)
    
print('total logloss:', np.mean(scores))

モデルの再作成と保存

import joblib

model = XGBClassifier(learning_rate=0.4, max_depth=8, n_estimators=10, eval_metric='logloss')
model.fit(X_train, y_train)

joblib.dump(model, './model.joblib')

KaggleへのSubmit

テストデータでの予測の実行(1)

test_df = pd.read_csv('/kaggle/input/titanic/test.csv')
test_df2 = test_df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)

for category in ['Sex', 'Embarked']:
    le = LabelEncoder()
    le.fit(test_df2[category])
    
    test_df2[category] = le.transform(test_df2[category])

test_df2

テストデータでの予測の実行(2)

model = joblib.load('./model.joblib')

pred_proba = model.predict_proba(test_df2.values)[:, 1]

survived = (pred_proba > 0.5).astype(int)
survived

予測結果のエクスポート(1)

submission_df = pd.read_csv('/kaggle/input/titanic/gender_submission.csv')
submission_df

予測結果のエクスポート(2)

submission_df['Survived'] = survived
submission_df

予測結果のエクスポート(3)

submission_df.to_csv('./titanic_submit.csv', index=False)

エクササイズ(一部)

決定木でのモデル作成

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

df_b = pd.read_csv('./train_fillna.csv')
df_b = df_b.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)

for category in ['Sex', 'Embarked']:
    le = LabelEncoder()
    le.fit(df_b[category])
    
    df_b[category] = le.transform(df_b[category])

X = df_b.drop('Survived', axis=1).values
y = df_b['Survived'].values

X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, random_state=0)

model = DecisionTreeClassifier(max_depth=3)
model.fit(X_train, y_train)
model.score(X_valid, y_valid)

ランダムフォレストでのモデル作成

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(max_depth=3, n_estimators=3)
model.fit(X_train, y_train)
model.score(X_valid, y_valid)
@inoccu
Copy link
Author

inoccu commented May 17, 2021

(7)基本統計量を見る

df.subscribe()

こちらタイポでした。

df.describe()

ご指摘ありがとうございます!修正しました。

@sezemiadmin
Copy link

(7)基本統計量を見る

df.subscribe()

こちらタイポでした。

df.describe()

ご指摘ありがとうございます!修正しました。

👍 👍 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment