[英]I am trying to implement SVM in scikit-learn with custom RBF kernel ,But it is showing an error ,what to do?
import pandas as pd
import numpy as np
from sklearn import preprocessing, svm
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import math
import numpy.linalg as la
df = pd.read_csv("DataWithoutHeader162.csv")
df.columns = ['Temperature','Humidity','Windspeed','Traffic','PM 2.5']
#print(df.head())
forecast_col = 'PM 2.5'
df['label'] = df[forecast_col].shift(1)
df.fillna(value=-99999, inplace=True)
X = np.array(df.drop(['label','PM 2.5'] , 1))
X = preprocessing.scale(X)
df.dropna(inplace = True)
y = np.array(df['label'])
df.dropna(inplace = True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05)
#kernel definition
def radial_basis(gamma=10):
return lambda x, y: np.exp(-gamma*la.norm(np.subtract(x, y)))
#SupportVectorMachine with radial_basis Kernel
clf_SVM_radial_basis = SVC(kernel = radial_basis())
clf_SVM_radial_basis.fit(X_train,y_train)
confidence3 = clf_SVM_radial_basis.score(X_test,y_test)
print("Confidence of SVM with radial_basis Kernel = ",(confidence3*100),"%")
此代碼顯示錯誤:
Traceback (most recent call last):
File "F:\MachineLearningPyCodes\SvmOnDelhiAqiDataPrbf.py", line 68, in
module
clf_SVM_radial_basis.fit(X_train,y_train)
File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 189, in fit
fit(X, y, sample_weight, solver_type, kernel, random_seed=seed)
File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 230, in
_dense_fit
if X.shape[0] != X.shape[1]:
IndexError: tuple index out of range
我嘗試了不同的方法,但我無法按照我的要求格式化我的數據集,請告訴我一個方法來做到這一點。
我對SVC
kernel
論證的工作原理感到困惑。 你擁有它不僅僅是內核函數radial_basis
; 它實際上必須返回Gram矩陣 。 您可以在sklearn文檔中看到:
http://scikit-learn.org/stable/modules/svm.html#custom-kernels
總結該部分:您有兩個選擇。
(1)將Gram矩陣直接插入fit()
方法(不僅僅是普通的X_train
),並使用kernel='precomputed'
; 要么
(2)編寫一個返回Gram矩陣的函數,然后將該函數傳遞給kernel
。
這個SO有很好的例子。 適應他們所寫的內容,你可以這樣做。 我將使用第二種方法,我會保留你原來的radial_basis
作為插圖。
def radial_basis(x, y, gamma=10):
return np.exp(-gamma * la.norm(np.subtract(x, y)))
def proxy_kernel(X, Y, K=radial_basis):
"""Another function to return the gram_matrix,
which is needed in SVC's kernel or fit
"""
gram_matrix = np.zeros((X.shape[0], Y.shape[0]))
for i, x in enumerate(X):
for j, y in enumerate(Y):
gram_matrix[i, j] = K(x, y)
return gram_matrix
clf_SVM_radial_basis = SVC(kernel=proxy_kernel) # Note that it's proxy_kernel here now
clf_SVM_radial_basis.fit(X_train, y_train)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.