カテゴリを識別する境界線をそのカテゴリのマージンが最大になるように設定する手法。
以下の「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