kNN功能应作为列表传递

问题描述

我的数据就像:

sample1 = [[1,3,5,9],1.5,0]
sample2 = [[0,4,6,2,0],1.9,1]
sample3 = [[9,7,1.3,1] 
paul = pd.DataFrame(data = [sample1,sample2,sample3],columns=`['list','cat','metr','target'])`

应使用此数据完成具有特定距离函数的scikit学习kNN回归。

距离函数是:

def my_distance(X,Y,**kwargs):
    if len(X)>1:
        x = X
        y = Y
        all_minima = []
        for k in range(len(x)):
            one_minimum = min(x[k],y[k])
            all_minima.append(one_minimum)
            
        sum_all_minima=sum(all_minima)
        distance = (sum(x)+sum(y)-sum_all_minima) * kwargs["Para_list"]
      
    elif  X.dtype=='int64':
        x = X
        y = Y
        if x == y and x != -1:
            distance = 0
        elif x == -1 or y == -1 or x is None or y is None:
            distance = kwargs["Para_minus1"] * 1
        else:
            distance = kwargs["Para_nominal"] * 1
    else:
        x = X
        y = Y
        if x == y:
            distance = 0
        elif x == -1 or y == -1 or x is None or y is None:
            distance = kwargs["Para_minus1"] * 1
        else:
            distance = abs(x-y) * kwargs["Para_metrisch"]
    return distance

并且应通过以下方式实现为有效的距离函数

DistanceMetric.get_metric('pyfunc',func=my_distance)

没错,scikit代码应如下所示:

train,test = train_test_split(paul,test_size = 0.3)

#x_train soll nur unabhähgige Variablen enthalten,andere kommen raus:
x_train = train.drop('target',axis=1)
y_train = train['target']

x_test = test.drop('target',axis = 1)
y_test = test['target']

knn = KNeighborsRegressor(n_neighbors=2,algorithm='ball_tree',metric=my_distance,metric_params={"Para_list": 2,"Para_minus1": 3,"Para_metrisch": 2,"Para_nominal": 4}))
knn.fit(x_train,y_train)
y_pred=knn.predict(x_test)

我明白了

ValueError: setting an array element with a sequence.

我猜scikit无法将单个功能项作为列表处理?有没有办法做到这一点?

解决方法

我猜scikit无法将单个功能项作为列表处理?有没有办法做到这一点?

不,我没有办法做到这一点。您需要将此功能转换为2D矩阵,并将其与其他1D功能连接起来,以适当地形成数据。这是标准的# A table foobar <- tribble(~fooname,~value,"setosa",20,"versicolor",30,"virginica",10) # A function foobarjoin <- function(table,joincol){iris %>% left_join(table,by = c("Species" = {{ joincol }}))} # When I use the function foobarjoin(table = foobar,joincol = fooname) #> Error in standardise_join_by(by,x_names = x_names,y_names = y_names) : #> object 'fooname' not found 行为。

除非您有非常狭窄的用例,否则从列表功能制作2D数组是完全可以的。我认为所有列表的长度都相同。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...