BMI値の算出式で導き出された肥満度分類を、算出式を使わずSVM(サポートベクターマシン)で分類してみます。
手順としては下記の通りです。
①乱数を使って10000万件の身長・体重データを生成し、BMI値を算出し肥満度分類を行う。
②身長・体重データと肥満度分類のデータを8割の学習データと2割のテストデータに分ける。
③8割のデータを学習させる。
④学習データをもとに2割のテストデータでデータ予測を行う。
⑤データ予測がどれだけ正しかったかの結果を表示する。
[データ作成]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import random
def calc_bmi(height, weight): bmi = weight / (height / 100) ** 2 if bmi < 18.5: return '痩せ' elif bmi < 25: return '普通' else: return '肥満'
lst_label = [] lst_height_weight = [] for i in range(10000): height = random.randint(100, 200) weight = random.randint(30, 100) label = calc_bmi(height, weight)
lst_height_weight.append([height, weight]) lst_label.append(label)
|
[SVMを使っての学習と予測]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from sklearn import model_selection, svm, metrics import matplotlib.pyplot as plt import pandas as pd
data_train, data_test, label_train, label_test = \ model_selection.train_test_split(lst_height_weight, lst_label, test_size=0.2)
clf = svm.SVC() clf.fit(data_train, label_train)
predict = clf.predict(data_test)
|
[結果表示]
1 2 3
| print('正解率=', metrics.accuracy_score(label_test, predict)) print('レポート=\n', metrics.classification_report(label_test, predict))
|
[出力結果]
1 2 3 4 5 6 7 8 9 10 11
| 正解率= 0.994 レポート= precision recall f1-score support
普通 0.99 0.98 0.98 391 痩せ 0.99 1.00 0.99 430 肥満 1.00 1.00 1.00 1179
accuracy 0.99 2000 macro avg 0.99 0.99 0.99 2000 weighted avg 0.99 0.99 0.99 2000
|
正解率は99.4%と十分に納得いく結果となりました。
レポートの見方は下記の通りです。
名称 |
内容 |
precision |
予測が正だった中で、予測通り正答分類できた割合 |
recall |
実際に正だった中で、予測も正答だった割合 |
f1-score |
precisionとrecallの調和平均 |
support |
データ数 |
(Google Colaboratoryで動作確認しています。)