機器學習sklearn支持向量機分類 ---- 預測事件是否發生(event / nonevent)

# -*- coding: utf-8 -*-
"""
Created on Wed Aug  1 16:23:11 2018

@author: Administrator
"""
'''
SVM應用案例:分類
'''

import numpy as np
import sklearn.preprocessing as sp
import sklearn.model_selection as ms
import sklearn.svm as svm
import sklearn.metrics as sm
import matplotlib.pyplot as plt

# 自定義編碼器:數字編碼
class DigitEncoder():
    def fit_transform(self, y):
        return y.astype(int)
    
    def transform(self, y):
        return y.astype(int)
    
    def inver_transform(self, y):
        return y.astype(str)
    
data = []
with open('event.txt', 'r') as f:
    for line in f.readlines():
        data.append(line[:-1].split(','))
data = np.delete(np.array(data).T, 1, 0)        # 刪除axis=0即行,rowidex=1即第二行的數據
print('data[:,-1]:',data[-1,:])                 # 轉置後的最後一列
encoders, x = [], []
for row in range(len(data)):
#    print(data[2,0])
    if data[row, 0].isdigit():          # 數字,用自定義的encoder
        encoder = DigitEncoder()
    else:
        encoder = sp.LabelEncoder()     # 非數字,用sp的標籤編碼器
    if row < len(data) - 1:             # 前n-1行 x, 最後一行y
        x.append(encoder.fit_transform(data[row]))
    else:
        y = encoder.fit_transform(data[row])            # y: <class 'numpy.ndarray'>
    encoders.append(encoder)
x = np.array(x).T
print('x[5,:]:', x[:5,:], sep='\n', end='\n\n')
print('y:', y[:10])                                     # y: [1 1 1 1 1 1 1 1 1 1]

train_x, test_x, train_y, test_y = ms.train_test_split(x, y, test_size=0.25, random_state=7)
model = svm.SVC(kernel='rbf', class_weight='balanced')
# 交叉驗證評估模型:測試f1_score
print('f1_score:',ms.cross_val_score(model, x, y, cv=3, scoring='f1_weighted').mean())
# 0.938166292765643 fi_score可以,採用該參數組訓練模型

model.fit(train_x, train_y)                     # 訓練集訓練模型
pred_test_y = model.predict(test_x)             # 測試集測試模型
# test_set分類結果:如何確定0類和1類分別是代表
print('pred_test_y:',pred_test_y[:10])                 # pred_test_y: [1 1 1 1 1 1 1 1 1 1]

# 模型效果評估
print((pred_test_y == test_y).sum() / pred_test_y.size)         # 查準率
print(sm.confusion_matrix(test_y, pred_test_y))                 # 混淆矩陣 參數(實際輸出,預測輸出)
print(sm.classification_report(test_y, pred_test_y))            # 分類報告 參數(實際輸出,預測輸出)

# 根據輸入數據利用SVM模型進行分類預測
data = [['Tuesday','12:30:00','21','23']]
data = np.array(data).T
x = []
for row in range(len(data)):
    encoder = encoders[row]
    x.append(encoder.transform(data[row]))                      # 使用已有的編碼器
x = np.array(x).T
pred_y = model.predict(x)
output_y = encoders[-1].inverse_transform(pred_y)               # 解碼
print('pred_y:', pred_y)                                        # pred_y: [1]
print('output_y:', output_y)                                    # output_y: ['noevent']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章