在kaggle中处理“泰坦尼克号”数据集时发现输入变量样本数量不一致

问题描述 投票:0回答:1

我进行了玩具 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]

如何解决这个问题?

scikit-learn gridsearchcv
1个回答
0
投票

问题代码

从练习文件 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 的解释:

screenshot of the Q&A tab from LinkedIn Learning course

问题似乎来自于 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 行),因此造成了不一致。让我知道这个解决方案是否适合您

© www.soinside.com 2019 - 2024. All rights reserved.