首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3和Sklearn:难以将非sklearn模型用作sklearn模型

Python3和Sklearn:难以将非sklearn模型用作sklearn模型
EN

Stack Overflow用户
提问于 2020-02-16 03:48:25
回答 1查看 212关注 0票数 0

下面的代码正在工作。我有一个例程运行交叉验证方案,使用一个线性模型,先前定义的学习。我对此没有异议。我的问题是:如果我将代码model=linear_model.LinearRegression()替换为model=RBF('multiquadric') (请参阅__main__中的第14和第15行),它将不再工作。因此,我的问题实际上是在RBF课堂上,我试图模仿一个滑雪模型。

如果我替换了上面描述的代码,我会得到以下错误:

代码语言:javascript
复制
  FitFailedWarning)
/home/daniel/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
ValueError: All arrays must be equal length.

  FitFailedWarning)

1)我应该在RBF类中定义分数函数吗?

2)如何做到这一点?我迷路了。由于我继承了BaseEstimator和RegressorMixin,我希望这在内部得到解决。

3)还有什么东西不见了吗?

代码语言:javascript
复制
from sklearn import datasets
import numpy as np
import pandas as pd
from sklearn import linear_model
from sklearn import model_selection
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from scipy.interpolate import Rbf
np.random.seed(0)
from sklearn.base import BaseEstimator, RegressorMixin



class RBF(BaseEstimator, RegressorMixin):
    def __init__(self,function):
        self.function=function
    def fit(self,x,y):
        self.rbf = Rbf(x, y,function=self.function)
    def predict(self,x):   
        return self.rbf(x)    


if __name__ == "__main__":
    # Load Data
    targetName='HousePrice'
    data=datasets.load_boston()
    featuresNames=list(data.feature_names)
    featuresData=data.data
    targetData = data.target
    df=pd.DataFrame(featuresData,columns=featuresNames)
    df[targetName]=targetData
    independent_variable_list=featuresNames
    dependent_variable=targetName
    X=df[independent_variable_list].values
    y=np.squeeze(df[[dependent_variable]].values)    
    # Model Definition    
    model=linear_model.LinearRegression()
    #model=RBF('multiquadric')    
    # Cross validation routine
    number_splits=5
    score_list=['neg_mean_squared_error','neg_mean_absolute_error','r2']
    kfold = model_selection.KFold(n_splits=number_splits,shuffle=True, random_state=0)
    scalar = StandardScaler()
    pipeline = Pipeline([('transformer', scalar), ('estimator', model)])
    results = model_selection.cross_validate(pipeline, X, y, cv=kfold, scoring=score_list,return_train_score=True)
    for score in score_list:
        print(score+':')
        print('Train: '+'Mean',np.mean(results['train_'+score]),'Standard Error',np.std(results['train_'+score]))
        print('Test: '+'Mean',np.mean(results['test_'+score]),'Standard Error',np.std(results['test_'+score]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 05:46:53

让我们看一下文档这里

*args :数组 x,y,z,…,d,其中x,y,z,…是节点的坐标,d是节点上的值数组。

因此,它采用可变长度参数,最后一个参数是值,在您的情况下是y。参数k是所有数据点(所有其他参数z, y, z, …相同)的kth坐标。

在文档之后,您的代码应该是

代码语言:javascript
复制
from sklearn import datasets
import numpy as np
import pandas as pd
from sklearn import linear_model
from sklearn import model_selection
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from scipy.interpolate import Rbf
np.random.seed(0)
from sklearn.base import BaseEstimator, RegressorMixin

class RBF(BaseEstimator, RegressorMixin):
    def __init__(self,function):
        self.function=function
    def fit(self,X,y):        
        self.rbf = Rbf(*X.T, y,function=self.function)

    def predict(self,X):   
        return self.rbf(*X.T)


# Load Data
data=datasets.load_boston()

X = data.data
y = data.target


number_splits=5
score_list=['neg_mean_squared_error','neg_mean_absolute_error','r2']

kfold = model_selection.KFold(n_splits=number_splits,shuffle=True, random_state=0)
scalar = StandardScaler()

model = RBF(function='multiquadric')

pipeline = Pipeline([('transformer', scalar), ('estimator', model)])

results = model_selection.cross_validate(pipeline, X, y, cv=kfold, scoring=score_list,return_train_score=True)

for score in score_list:
        print(score+':')
        print('Train: '+'Mean',np.mean(results['train_'+score]),'Standard Error',np.std(results['train_'+score]))
        print('Test: '+'Mean',np.mean(results['test_'+score]),'Standard Error',np.std(results['test_'+score]))

输出

代码语言:javascript
复制
neg_mean_squared_error:
Train: Mean -1.552450953914355e-20 Standard Error 7.932530906290208e-21
Test: Mean -23.007377210596463 Standard Error 4.254629143836107
neg_mean_absolute_error:
Train: Mean -9.398502208736061e-11 Standard Error 2.4673749061941226e-11
Test: Mean -3.1319779583728673 Standard Error 0.2162343985534446
r2:
Train: Mean 1.0 Standard Error 0.0
Test: Mean 0.7144217179633185 Standard Error 0.08526294242760363

为什么*X.T:正如我们所看到的,每个参数对应于所有数据点的一个轴,因此我们转换它们,然后使用*操作符扩展和传递每个子数组作为变量长度函数的参数。

看起来,最新的实现有一个mode参数,在这里我们可以直接传递N-D数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60245240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档