X 有 232 个特征,但 StandardScaler 期望输入 241 个特征

我想使用 knn 进行预测,我有以下代码:

def knn(trainImages, trainLabels, testImages, testLabels):    max = 0    for i in range(len(trainImages)):        if len(trainImages[i]) > max:            max = len(trainImages[i])    for i in range(len(trainImages)):        aux = np.array(trainImages[i])        aux.resize(max)        trainImages[i] = aux    max = 0    for i in range(len(testImages)):        if len(testImages[i]) > max:            max = len(testImages[i])    for i in range(len(testImages)):        aux = np.array(testImages[i])        aux.resize(max)        testImages[i] = aux    scaler = StandardScaler()    scaler.fit(list(trainImages))    trainImages = scaler.transform(list(trainImages))    testImages = scaler.transform(list(testImages))    classifier = KNeighborsClassifier(n_neighbors=5)    classifier.fit(trainImages, trainLabels)    pred = classifier.predict(testImages)    print(classification_report(testLabels, pred))

我在 testImages = scaler.transform(list(testImages)) 处遇到了错误。我明白这是因为数组数量的差异导致的。我该如何解决这个问题?


回答:

scikit-learn 中的 scaler 期望输入形状为 (n_samples, n_features)。如果你的训练集和测试集的第二个维度不相等,那么不仅在 sklearn 中这是错误的并且会引发错误,从理论上讲也是没有意义的。测试集和训练集的 n_features 维度应该相等,但第一个维度可以不同,因为它表示样本数量,你可以在训练集和测试集中有任意数量的样本。

当你执行 scaler.transform(test) 时,它期望 test 具有与你执行 scaler.fit(train) 时相同的特征数量。因此,所有你的图像都应该具有相同的大小。

例如,如果你有 100 张图像,train_images 的形状应该类似于 (90,224,224,3),而 test_images 的形状应该类似于 (10,224,224,3)(只有第一个维度不同)。

所以,尝试这样调整你的图像大小:

import cv2resized_image = cv2.resize(image, (224,224)) #不包括通道维度

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注