我进行了玩具 Kaggle“泰坦尼克号”数据集训练,并按照名为“应用机器学习:算法”的 linkedin 视频课程的说明进行操作 当我输入以下代码时:发生错误:
lr = LogisticRegression()
parameters = {
'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}
cv = GridSearchCV(lr, parameters, cv=5)
cv.fit(tr_features, tr_labels.values.ravel())
print_results(cv)
ValueError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_7740/1127236825.py in <module>
5
6 cv = GridSearchCV(lr, parameters, cv=5)
7 cv.fit(tr_features, tr_labels.values.ravel())
8
9 print_results(cv)
~\AppData\Local\miniforge3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
61 extra_args = len(args) - len(all_args)
62 if extra_args <= 0:
63 return f(*args, **kwargs)
64
65 # extra_args > 0
~\AppData\Local\miniforge3\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params)
757 refit_metric = self.refit
758
759 X, y, groups = indexable(X, y, groups)
760 fit_params = _check_fit_params(X, fit_params)
761
~\AppData\Local\miniforge3\lib\site-packages\sklearn\utils\validation.py in indexable(*iterables)
354 """
355 result = [_make_indexable(X) for X in iterables]
356 check_consistent_length(*result)
357 return result
358
~\AppData\Local\miniforge3\lib\site-packages\sklearn\utils\validation.py in check_consistent_length(*arrays)
317 uniques = np.unique(lengths)
318 if len(uniques) > 1:
319 raise ValueError("Found input variables with inconsistent numbers of"
320 " samples: %r" % [int(l) for l in lengths])
ValueError: Found input variables with inconsistent numbers of samples: [534, 535]
如何解决这个问题?
从练习文件 02_04.ipynb(从 LinkedIn 学习课程下载)中,请注意第一个代码块中的最后一行:
tr_labels = pd.read_csv('../../../train_labels.csv', header=None)
import joblib
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore', category=FutureWarning)
warnings.filterwarnings('ignore', category=DeprecationWarning)
tr_features = pd.read_csv('../../../train_features.csv')
tr_labels = pd.read_csv('../../../train_labels.csv', header=None)
删除最后一行中的
header=None
参数。您的代码块现在应如下所示:
import joblib
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore', category=FutureWarning)
warnings.filterwarnings('ignore', category=DeprecationWarning)
tr_features = pd.read_csv('../../../train_features.csv')
tr_labels = pd.read_csv('../../../train_labels.csv')
我在 LinkedIn 学习课程的“问答”选项卡中找到了社区答案。在屏幕截图下方,我粘贴了 Maxwell Bauer 的解释:
问题似乎来自于 train_labels.csv 的读取。如果 header 参数在 'pd.read_csv('train_labels.csv, header = None)' 中定义为 'None',则 train_labels.csv 的实际标题不会被读取为标题,而是被解释为第 0 行。 如果删除标头参数定义并创建读取函数“pd.read_csv('train_labels.csv')”,它似乎可以解决问题,因为现在该函数正在使用标头的默认解释(推断)。此默认设置使得 train_labels.csv 的标题被解释为标题。这是建议的解决方案: tr_features = pd.read_csv('train_features.csv') tr_labels = pd.read_csv('train_labels.csv') 对于什么是值得的,我通过查看 csv 的处理方式来诊断问题:我使用上述解决方案读取文件,在新单元中运行“tr_features”,然后在另一个新单元中运行“tr_labels”。在不同的单元格中运行 tr_features 和 tr_labels 将显示程序如何解释 csv。结果,我可以看到 csv 的标头被解释为建议解决方案的标头。如果您随后将标题参数定义 (header = None) 添加到 tr_labels = pd.read_csv('train_labels.csv') 中,然后运行 'tr_labels',您可以看到标题 'Survived' 现在位于第 0 行,而不是表头。因此,与“tr_features”矩阵(具有 534 行)相反,“tr_labels”列向量的长度扩展了 1(使其具有 535 行),因此造成了不一致。让我知道这个解决方案是否适合您