如何解决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数组是完全可以的。我认为所有列表的长度都相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。