この記事では、Pythonを使って「身長と体重のデータから性別を予測する」機械学習モデルを作りながら、機械学習の基本的な流れを解説していきます。
機械学習に興味があるけれど、何から始めればいいか分からないという方に向けて、できるだけわかりやすく丁寧に進めていきたいと思います。よろしくお願いします。
【入門】身長と体重から性別を予測!Pythonで学ぶ機械学習の基本ステップ
1. 機械学習の基本ステップ
機械学習の基本ステップは次のようになります。
- データの収集
- データの前処理
- モデルの選定
- 学習(トレーニング)
- 評価
- 推論(予測)
2. データの収集(Step 1)
今回は説明用に、以下のような身長・体重・性別のダミーデータを用意します。
import pandas as pd
# ダミーデータの作成
data = pd.DataFrame({
'身長(cm)': [160, 165, 170, 175, 180, 155, 150, 158, 168, 172],
'体重(kg)': [50, 60, 65, 70, 80, 45, 42, 48, 55, 68],
'性別': ['女', '男', '男', '男', '男', '女', '女', '女', '男', '男']
})
print(data)
身長(cm) 体重(kg) 性別
0 160 50 女
1 165 60 男
2 170 65 男
3 175 70 男
4 180 80 男
5 155 45 女
6 150 42 女
7 158 48 女
8 168 55 男
9 172 68 男
3. データの前処理(Step 2)
機械学習モデルは数値しか扱えないため、「男」「女」といったカテゴリデータは数値(0, 1)に変換する必要があります。また、モデルに渡すために特徴量とラベルに分けておきます。
from sklearn.preprocessing import LabelEncoder
# 性別を0(女)、1(男)に変換
le = LabelEncoder()
data['性別'] = le.fit_transform(data['性別'])
# 説明変数(身長と体重)と目的変数(性別)に分割
X = data[['身長(cm)', '体重(kg)']]
y = data['性別']
4. モデルの選定と学習(Step 3 & 4)
今回はシンプルな分類問題なので、基本的なアルゴリズムである「ロジスティック回帰」を使用します。まずは訓練データとテストデータに分割し、モデルを学習させます。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 訓練用とテスト用に分割(70%:30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# モデルの学習
model = LogisticRegression()
model.fit(X_train, y_train)
5. モデルの評価(Step 5)
テストデータを使って、モデルの性能を確認します。ここでは、正解率(Accuracy)と混同行列(Confusion Matrix)を確認してみましょう。
from sklearn.metrics import accuracy_score, confusion_matrix
# テストデータに対する予測
y_pred = model.predict(X_test)
# 正解率
print("正解率:", accuracy_score(y_test, y_pred))
# 混同行列
print("混同行列:\n", confusion_matrix(y_test, y_pred))
6. 性別を予測してみる(Step 6)
学習したモデルを使って、例えば「身長165cm、体重55kg」の人がどちらの性別かを予測してみます。
import numpy as np
# 新しいデータの作成
sample = np.array([[165, 55]])
prediction = model.predict(sample)
# 数値をラベルに戻す(0→女、1→男)
print("予測された性別:", le.inverse_transform(prediction)[0])
まとめ
今回はある人の身長と体重のデータから性別を推論する、というテーマを元に機械学習について解説しました。この記事で機械学習についてのイメージが湧いたら嬉しい限りです。
機械学習についてより詳しく知りたい方はオライリーが出している本などもおすすめです。理論から実装までを丁寧に解説してくれています。
今回使ったコードは以下になります。不明点や気になるところがあればコメント欄までお願いします。それではまた。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
import numpy as np
# データ作成
data = pd.DataFrame({
'身長(cm)': [160, 165, 170, 175, 180, 155, 150, 158, 168, 172],
'体重(kg)': [50, 60, 65, 70, 80, 45, 42, 48, 55, 68],
'性別': ['女', '男', '男', '男', '男', '女', '女', '女', '男', '男']
})
# ラベルエンコード
le = LabelEncoder()
data['性別'] = le.fit_transform(data['性別'])
# 特徴量とラベル
X = data[['身長(cm)', '体重(kg)']]
y = data['性別']
# 訓練・テスト分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# モデル学習
model = LogisticRegression()
model.fit(X_train, y_train)
# 評価
y_pred = model.predict(X_test)
print("正解率:", accuracy_score(y_test, y_pred))
print("混同行列:\n", confusion_matrix(y_test, y_pred))
# 推論
sample = np.array([[165, 55]])
prediction = model.predict(sample)
print("予測された性別:", le.inverse_transform(prediction)[0])
コメント