Python sklearn 中的SVM示例

2021-08-28 11:32:09 字數 3310 閱讀 6399

# -*- coding: utf-8 -*-

import pandas as pd

from numpy.random import shuffle

from sklearn import svm

import joblib

from sklearn import metrics

inputfile = '../data/moment.csv'

outputfile1 = '../data/watereval_train.csv'

outputfile2 = '../data/watereval_test.csv'

def readdata():

"""讀取資料

:return:

"""data = pd.read_csv(inputfile, encoding='utf8')

data = data.as_matrix().astype(float)

shuffle(data) # 隨機打亂

data_train = data[:int(0.8 * len(data)), :] # 訓練集矩陣

data_test = data[int(0.8 * len(data)):, :] # 測試集矩陣

return data_train, data_test

def train(data_train, data_test):

"""訓練

:param data_train:

:param data_test:

:return:

"""x_train = data_train[:, 2:] * 30 # 放大特徵,矩陣2維

y_train = data_train[:, 0].astype(int) # 矩陣1維

x_test = data_test[:, 2:] * 30 # 放大特徵

y_test = data_test[:, 0].astype(int)

# c:錯誤項的懲罰係數。c越大,即對分錯樣本的懲罰程度越大,因此在訓練樣本中準確率越高,但是泛化能力降低,也就是對測試資料的分類準確率降低。相反,減小c的話,容許訓練樣本中有一些誤分類錯誤樣本,泛化能力強。對於訓練樣本帶有雜訊的情況,一般採用後者,把訓練樣本集中錯誤分類的樣本作為雜訊。

# kernel='linear'時,為線性核,c越大分類效果越好,但有可能會過擬合(defaul c=1)。

# kernel='rbf'時(default),為高斯核,gamma值越小,分類介面越連續;gamma值越大,分類介面越「散」,分類效果越好,但有可能會過擬合。

# kernel='poly'時,多項式函式,degree 表示多項式的程度-----支援非線性分類。更高gamma值,將嘗試精確匹配每乙個訓練資料集,可能會導致泛化誤差和引起過度擬合問題。

# kernel='sigmoid'時,支援非線性分類。更高gamma值,將嘗試精確匹配每乙個訓練資料集,可能會導致泛化誤差和引起過度擬合問題。

# gamma:float引數 預設為auto。核函式係數,只對『rbf』,『poly』,『sigmod』有效。如果gamma為auto,代表其值為樣本特徵數的倒數,即1/n_features.

# decision_function_shape='ovr'時,為one v rest,即乙個類別與其他類別進行劃分,

# decision_function_shape='ovo'時,為one v one,即將類別兩兩之間進行劃分,用二分類的方法模擬多分類的結果。

# probability:bool引數 預設為false,是否啟用概率估計。 這必須在呼叫fit()之前啟用,並且會fit()方法速度變慢。

# cache_size:float引數 預設為200,指定訓練所需要的記憶體,以mb為單位,預設為200mb。

# class_weight:字典型別或者『balance』字串。預設為none,給每個類別分別設定不同的懲罰引數c,如果沒有給,則會給所有類別都給c=1,即前面引數指出的引數c.如果給定引數『balance』,則使用y的值自動調整與輸入資料中的類頻率成反比的權重。

# max_iter :int引數 預設為-1,最大迭代次數,如果為-1,表示不限制

model = svm.svc(c=1.0, kernel='rbf', gamma='auto', decision_function_shape='ovr', cache_size=500)

model.fit(x_train, y_train)

joblib.dump(model, '../models/watereval_svm.model')

return x_train, y_train, x_test, y_test

def eval(x_train, y_train, x_test, y_test):

"""評估

:param x_train:

:param y_train:

:param x_test:

:param y_test:

:return:

"""model = joblib.load('../models/watereval_svm.model')

print("訓練集得分:" + str(model.score(x_train, y_train)))

print("測試集得分:" + str(model.score(x_test, y_test)))

cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) # 訓練集混淆矩陣

cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) # 測試集混淆矩陣

pd.dataframe(cm_train, index=range(1, 6), columns=range(1, 6)).to_csv(outputfile1)

pd.dataframe(cm_test, index=range(1, 6), columns=range(1, 6)).to_csv(outputfile2)

if __name__ == '__main__':

data_train, data_test = readdata()

x_train, y_train, x_test, y_test = train(data_train, data_test)

eval(x_train, y_train, x_test, y_test)

資料樣式:

python sklearn庫中的缺失值填充

今天小萌新複習資料探勘課程的知識點,當看到缺失值填充 imputation of missing values 部分,被sklearn庫中的transform函式搞暈了。看了幾篇前輩們的部落格,來這裡總結一下。請大家指正。原始資料中會有一些缺失的屬性值,一般人都會選擇自動填充。import nump...

Python sklearn 交叉驗證

from sklearn.datasets import load boston from sklearn.model selection import cross val score from sklearn.tree import decisiontreeregressor boston loa...

python sklearn庫實現簡單邏輯回歸

import xlrd import matplotlib.pyplot as plt import numpy as np from sklearn import model selection from sklearn.linear model import logisticregression...