LoginSignup
2
4

More than 1 year has passed since last update.

Udemy「みんなのKaggle講座」の特徴量エンジニアリングをまとめてみた

Posted at

はじめに

Udemyの我妻先生の「みんなのKaggle講座」 を受講させていただきました。
大変わかりやすかったので、Kaggleに取り組んでみたいと思われているみなさんにおすすめです。
その中での特徴量エンジニアリングについて勉強になったところをアウトプットさせていただきます。
この記事を見て、少しでも気になった方はぜひ購入を検討してみてください。

特徴量エンジニアリングとは

  • データを機械学習が扱える形に変換すること
  • モデル精度向上に有効な新たな特徴量を作成すること

事前準備

データの読み込み

今回はタイタニックのデータを用いています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

train_data.info()
test_data.info()

データの傾向を把握する

どういう傾向の人がタイタニック号で生き残りやすかったのかを把握することがタイタニックのコンペの目的です。
なので、生存したかどうかと他の特徴量それぞれの関係性を見ていきます。
seabornを利用して、データの傾向を把握します。

兄弟、配偶者の数

sns.countplot(x = 'SibSp', hue = 'Survived', data = train_data)
plt.legend()
plt.show()

出力
image.png

両親、子供の数

sns.countplot(x = 'Parch', hue = 'Survived', data = train_data)
plt.legend()
plt.show()

出力
image.png

チケットのクラス

sns.countplot(x = 'Pclass', hue = 'Survived', data = train_data)
plt.show()

出力
image.png

性別

sns.countplot(x = 'Sex', hue = 'Survived', data = train_data)
plt.show()

出力
image.png

出港地

sns.countplot(x = "Embarked", hue = "Survived", data = train_data)
plt.show()

出力
image.png

年齢の分布

bins = 25
alpha = 0.6

# loc関数で行と列を指定。
plt.hist(x = train_data.loc[train_data["Survived"] == 0, "Age"].dropna(),bins = bins, alpha = alpha, label = "0")
plt.hist(x = train_data.loc[train_data["Survived"] == 1, "Age"].dropna(),bins = bins, alpha = alpha, label = "1")

# 軸ラベル
plt.xlabel(xlabel = "Age")
plt.ylabel(ylabel = "Count")

plt.legend()
plt.show()

出力
image.png

料金の分布

bins = 25
alpha = 0.6

plt.hist(x = train_data.loc[train_data["Survived"] == 0, "Fare"].dropna(), bins = bins, alpha = alpha, label = "0")
plt.hist(x = train_data.loc[train_data["Survived"] == 1, "Fare"].dropna(), bins = bins, alpha = alpha, label = "1")

plt.xlabel(xlabel = "Fare")
plt.ylabel(ylabel = "Count")

plt.legend()
plt.show()

出力
image.png

特徴量エンジニアリング

データを機械学習に扱える形(数字)に変換する

性別がmaleやfemaleのままだと、ランダムフォレストでは扱えないので
数字に変換する。

data = pd.concat(objs = [train_data, test_data], sort = False) #sortをfalseにしてそのまま結合

data.replace(to_replace = ["male", "female"], value = [0,1], inplace = True)

data["Embarked"].fillna(value = ("S"), inplace = True)
data["Embarked"] = data["Embarked"].map({"S": 0, "C": 1, "Q": 2})

data["Fare"].fillna(value = data["Fare"].mean(), inplace = True)
data["Age"].fillna(value = data["Age"].mean(), inplace = True)

data.head()

新しい特徴量「Family」を作成

SibSp(兄弟、配偶者の数)とParch(親、子供の数)を組み合わせてFamilyという特徴量を新たに作成する。

data["Family"] = data["Parch"] + data["SibSp"]

train_data["Family"] = data["Family"][:len(train_data)]
test_data["Family"] = data["Family"][len(train_data):]

sns.countplot(x = "Family", data = train_data, hue = "Survived")
plt.legend()
plt.show()

必要な特徴量だけで、機械学習モデルへの入力を作成する。

# 列を削除
data.drop(labels = ["Name", "PassengerId", "SibSp", "Parch", "Ticket", "Cabin"],
          axis = 1, inplace = True) # axis = 1を設定して、column(列)を削除

# [始点:終点]の形で、データを分ける
train_data = data[:len(train_data)]
test_data = data[len(train_data):]

t = train_data["Survived"]
x_train = train_data.drop(labels = "Survived", axis = 1)
x_test = test_data.drop(labels = "Survived", axis = 1)

x_train.head()

まとめ

いかがだったでしょうか。
今回の記事はUdemyの我妻先生の「みんなのKaggle講座」 の特徴量エンジニアリングについてをまとめさせていただきました。
今年中に自分はKaggle Exeprtになることを目指して、頑張っていますのでもし誤りなどあればご指摘いただけると助かります。
お読みいただいてありがとうございました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4