【入門】身長と体重から性別を予測!Pythonで学ぶ機械学習の基本ステップ

この記事では、Pythonを使って「身長と体重のデータから性別を予測する」機械学習モデルを作りながら、機械学習の基本的な流れを解説していきます。

機械学習に興味があるけれど、何から始めればいいか分からないという方に向けて、できるだけわかりやすく丁寧に進めていきたいと思います。よろしくお願いします。


目次

入門】身長と体重から性別を予測!Pythonで学ぶ機械学習の基本ステップ

1. 機械学習の基本ステップ

機械学習の基本ステップは次のようになります。

  1. データの収集
  2. データの前処理
  3. モデルの選定
  4. 学習(トレーニング)
  5. 評価
  6. 推論(予測)

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])
よかったらシェアしてね!

この記事を書いた人

えだはのアバター えだは ITエンジニア

2001年生まれの♂。愛知県出身。
国立大学の情報学科を卒業後、某ユーザ系IT企業に就職。
2022年に当ブログ「えだはの部屋」を開設。
ブログ収益は100円〜1000円の間で常に低空飛行をしており、基本赤字。
将来の夢は億万長者。

コメント

コメントする

目次