Python

Pythonで機械学習を学ぶ SVM

カテゴリを識別する境界線をそのカテゴリのマージンが最大になるように設定する手法。

以下の「Forest Fires Data Set」で実験します。

ポルトガル北東部の森林火災の焼失面積の気象データ。入力は以下の通り。

1. X – モンテシーニョ公園マップ内のX軸空間座標。1~9

2. Y – モンテシーニョ公園マップ内のY軸空間座標。2から9まで

3. 月 – その年の月:’jan’ to ‘dec’

4. day – 曜日を表す:’mon’ から ‘sun’ まで

5. FFMC – FWIシステムからのFFMC指数:18.7~96.20

6. DMC – FWIシステムのDMC指数:1.1~291.3

7. DC – FWIシステムからのDCの索引:7.9から860.6まで

8. ISI – FWIシステムからのISIインデックス:0.0~56.10

9. 温度 – 摂氏の程度の温度:2.2 から 33.30

10. RH – 相対湿度(%):15.0~100

11. 風 – 風速(km/h):0.40~9.40

12. 雨量 – 外雨量(mm/m2):0.0~6.4

13. 面積 – 森林の焼失面積(単位:ha):0.00~1090.84

データの読み込みと確認と整理

import pandas as pd
import requests
import io
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 読み込み
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/forest-fires/forestfires.csv'
res = requests.get(url).content
data = pd.read_csv(io.StringIO(res.decode('utf-8')),
                   header=None, skiprows=1)
data.columns = ['X', 'Y', 'month', 'day', 'FFMC', 'DMC',
                'DC', 'ISI', 'temp', 'RH', 'wind', 'rain', 'area']

# 確認
print('データ形式:{}'.format(data.shape))
print(data.head())
# print(data.dtypes)

# 10以上のときにTureにする
data['flg'] = data['area'].map(lambda x: 1 if x >= 10 else 0)

モデルの構築と評価

# 目的変数、説明変数
X = data[['FFMC', 'DMC', 'DC', 'ISI', 'temp', 'wind', 'rain']]
y = data['flg']

# 訓練データとテストデータの準備
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=0)

# 標準化
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

# 学習
model = LinearSVC()
model.fit(X_train, y_train)

# 結果
print('train:{:.3f}'.format(model.score(X_train_std, y_train)))
print('test:{:.3f}'.format(model.score(X_test_std, y_test)))

結果

train:0.758
test:0.740