knn,无法使用灵活类型执行 reduce

knn, cannot perform reduce with flexible type

y = df.pitch_name
y = np.array(y)
y = y.reshape(-1, 1)
from sklearn.preprocessing import OrdinalEncoder

ord_enc = OrdinalEncoder()
y = ord_enc.fit_transform(y.reshape(-1, 1))
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=12345
)
knn_model = KNeighborsRegressor(n_neighbors=3)
knn_model.fit(X_train, y_train)
knn_model.predict([X_test[0]])

X全是float值,y全是string类型。如果我使用 ordinalEncoder 并使用模型进行预测,它可以工作,但问题是当我想要获得确切的类别时,我得到的结果有时不是整数(例如 6.3333)。

因此,每当我用原始分类值字符串拟合模型时,我都会看到此错误消息 TypeError: cannot perform reduce with flexible type。当我检查错误消息时,我想错误是由于 238 而发生的,他们在应该的时候尝试获取 y_pred = np.mean(_y[neigh_ind], axis=1)是中位数,因为 y 是一个字符串列表?任何帮助将不胜感激。

    237         if weights is None:
--> 238             y_pred = np.mean(_y[neigh_ind], axis=1)
    239         else:
    240             y_pred = np.empty((X.shape[0], _y.shape[1]), dtype=np.float64)

如果我误解了什么,请原谅我,但听起来您正在尝试使用回归模型进行分类:KNeighborsRegressor

here可以看出:

Neighbors-based regression can be used in cases where the data labels are continuous rather than discrete variables. The label assigned to a query point is computed based on the mean of the labels of its nearest neighbors.

所以,通过使用 OrdinalEncoder,你只是编码了浮点类别,然而,之后你预测了它最近邻居的标签的平均值,这不是一个整数,因此不是一个类别.

我建议您阅读 this,以了解如何使用 KNeighborsClassifier