scikit-learn报”ValueError: Found input variables with inconsistent numbers of samples: {n_samples1}, {n_samples2} “的原因以及解决办法

  • Post category:Python

“ValueError: Found input variables with inconsistent numbers of samples” 这个报错通常是因为输入模型的特征矩阵与标签向量之间的大小不一致。以下是解决办法:

  1. 确认输入的特征矩阵和标签向量的行数是否一致。通常,特征矩阵的行数应该等于样本的数量,而标签向量应该只有一列。如果两者的行数不一致,将会出现该报错。可以通过打印特征矩阵和标签向量的shape属性来查看它们的形状是否一致,例如:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 读取数据
data = pd.read_csv('data.csv')

# 特征矩阵和标签向量
X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values

# 打印形状
print(X.shape)
print(y.shape)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型并进行预测
regressor = LinearRegression()
regressor.fit(X_train, y_train)  # 报错:Found input variables with inconsistent numbers of samples: 24, 6
y_pred = regressor.predict(X_test)

在上面的代码中,特征矩阵X有24行,而标签向量y只有6行,因此会出现该报错。

  1. 确认特征矩阵和标签向量的顺序是否一致。通常,特征矩阵和标签向量需要保持同样的顺序,以确保它们之间的匹配正确。可以通过打印特征矩阵和标签向量来确认它们的顺序是否一致。

  2. 确认使用的算法是否支持多维输入数据。有些算法只支持二维输入数据,例如SVM。在使用这些算法之前,需要将特征矩阵转换为二维数组。例如,可以使用numpy的reshape函数将特征矩阵转换为二维数组:

import numpy as np
from sklearn.svm import SVC

# 特征矩阵和标签向量
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])

# 转换为二维数组
X = np.reshape(X, (3, 3))

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型并进行预测
clf = SVC()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

在上面的代码中,特征矩阵X最初是一个三维数组,因此需要使用reshape函数将其转换为二维数组。