【问题标题】:I am trying to implement SVM in scikit-learn with custom RBF kernel ,But it is showing an error ,what to do?我正在尝试使用自定义 RBF 内核在 scikit-learn 中实现 SVM,但它显示错误,该怎么办?
【发布时间】:2017-10-15 02:59:43
【问题描述】:
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  

我尝试了不同的方法,但我想我无法按要求格式化我的数据集,请告诉我一种方法。

【问题讨论】:

    标签: python machine-learning scikit-learn svm


    【解决方案1】:

    我也对SVCkernel 参数的工作方式感到困惑。它不仅仅是你所拥有的内核函数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)
    

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 2014-03-15
      • 2020-07-06
      • 2018-03-07
      • 2015-09-29
      • 2013-07-21
      • 1970-01-01
      • 2015-10-14
      • 2014-07-10
      相关资源
      最近更新 更多