【问题标题】:Why do I get 1D array instead of 2D array Index error for Machine Learning为什么机器学习会出现一维数组而不是二维数组索引错误
【发布时间】:2020-11-13 14:29:47
【问题描述】:

我正在尝试根据下面的 python 代码基于特定的分类字段(性别和最高证书、倾角、度)来预测收入(70000+)。

我为平均收入创建了一个范围,然后指定了我想预测的具体收入范围(70000+) (性别和最高证书、倾角、度数)

我有以下代码。但是,当我进入代码的 One hot encoding 部分时出现错误。我在 Visual Studio 上使用 python。我尝试将分类字段更改为“年龄”,但它不起作用。代码如下。请问我该如何解决?谢谢。

 # %% read dataframe from part1
import pandas as pd
 
df = pd.read_pickle("data.pkl")
 
#%%
import numpy as np
bins = [0, 30000, 50000, 70000, 100000, np.inf]
names = ['<30000', '30000-50000', '50000-70000', '70000-100000', '100000+']
 
df['Avg Emp Income Range'] = pd.cut(df['Avg Emp Income'], bins, labels=names)
 
#%% OHE of Avg empl income
for val in df["Avg Emp Income Range"].unique():
    df[f"Avg Emp Income Range_{val}"] = df["Avg Emp Income Range"] == val
 
#%% selecting data
x= ["Sex","Highest Cert,dip,deg"]
 
#%%
success = ["Avg Emp Income Range_70000-100000","Avg Emp Income Range_100000+"]
y = success
 
# %% split into training / testing sets
from sklearn.model_selection import train_test_split
 
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=123)
 
#%%
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
import numpy as np
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score
 
enc = OneHotEncoder(handle_unknown="ignore")
ct = ColumnTransformer(
    [
        ("ohe", enc, ["Sex","Highest Cert,dip,deg",])
    ],
    remainder="passthrough",
)
 
x_train = ct.fit_transform(x_train)
x_test = ct.transform(x_test)

我收到此错误

错误: -------------------------------------------------- ------------------------- ValueError Traceback(最近一次调用 最后)c:\Users\maria\Documents\Project Capstone 2\Z NO\machine L.py in 42) 43 ---> 44 x_train = ct.fit_transform(x_train) 45 x_test = ct.transform(x_test)

c:\Users\maria\Documents\Project Capstone 2\Z NO\venv\lib\site-packages\sklearn\compose_column_transformer.py 在 fit_transform(自我,X,Y) 522 其他: 第523章 --> 524 X = check_X(X) 第525章 526 self._check_n_features(X,重置=真)

c:\Users\maria\Documents\Project Capstone 2\Z NO\venv\lib\site-packages\sklearn\compose_column_transformer.py 在 _check_X(X) 649 如果 hasattr(X, 'array') 或 sparse.issparse(X): 650 返回 X --> 651 返回 check_array(X, force_all_finite='allow-nan', dtype=np.object) 652 653

c:\Users\maria\Documents\Project Capstone 2\Z NO\venv\lib\site-packages\sklearn\utils\validation.py 在 inner_f(*args, **kwargs) 70 未来警告) 71 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)}) ---> 72 返回 f(**kwargs) 第73章 74

c:\Users\maria\Documents\Project Capstone 2\Z NO\venv\lib\site-packages\sklearn\utils\validation.py 在 check_array(数组,accept_sparse,accept_large_sparse,dtype,顺序, 复制,force_all_finite,ensure_2d,allow_nd,ensure_min_samples, ensure_min_features,估计器) 第621章 622 “你的数据有一个单一的特征或 array.reshape(1, -1)” --> 623 "如果它包含一个样本。".format(array)) 624 625 # 未来 np.flexible dtypes 将像 object dtypes 一样处理

ValueError:应为 2D 数组,但得到 1D 数组:array=['Sex']。 如果您的数据有 单一特征或 array.reshape(1, -1) 如果它包含单个样本。

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    你说,你训练的数据是

    x = ["Sex","Highest Cert,dip,deg"]
    y = ["Avg Emp Income Range_70000-100000","Avg Emp Income Range_100000+"]
    # splitting the data
    x_train = train_test_split(x, y, random_state=123)
    

    但是你编码的是一个tupel的数组

    ct = ColumnTransformer([("ohe", enc, ["Sex","Highest Cert,dip,deg",])])
    

    现在,如果您调用 ct.fit_transform(x_train),编码对象 cf 期望输入为一维大小(因为它只是被编码为元组数组),但您的数据是二维数组,这会引发例外。

    但是,我假设您更愿意使用 xy 作为数据矩阵 df 的键:

    x = ["Sex","Highest Cert,dip,deg"]
    y = ["Avg Emp Income Range_70000-100000","Avg Emp Income Range_100000+"]
    # splitting the data
    x_train = train_test_split(df[x], df[y], random_state=123)
    

    在 iPython 中使用调试选项或逐步执行代码会很有帮助,这样您就可以跟踪数组的大小以及代码是否确实按照您的想法执行。

    【讨论】:

    • 谢谢@max。我试过这个它有效,但最终给了我错误:目标是多标签指标但平均值='二进制'。请选择另一个平均设置,[None, 'micro', 'macro', 'weighted', 'samples'] 我相信这是因为我为 y 使用了两列。我可能会尝试更改范围,看看会发生什么。还有其他想法吗?
    • 是和不是。您没有在这里调用度量(尽管您正在导入precision_score,这可能会引发此错误。请参阅here。这不再是您的问题的一部分。无论如何,只需将参数average=None 添加到函数中,这提出了这个错误,你会得到两个标签的分数。顺便说一句:如果你发布整个错误消息会容易得多。我发现这在评论中很困难
    • 非常感谢这个工作。只是我的精度和召回率为零,但我会将其作为一个新问题发布。
    【解决方案2】:

    您的 xy 数据设置不正确:您只是将列标题用作列表而不是数据框的值。尝试设置:

    x = df[["Sex","Highest Cert,dip,deg"]]
    y = df[["Avg Emp Income Range_70000-100000","Avg Emp Income Range_100000+"]]
    

    【讨论】:

    • 感谢@rftr 的回复。我试过了,但它给了我错误:“仅熊猫数据帧支持使用字符串指定列”。我想相信这是因为我使用 numpy 来创建范围。我对 python 和机器学习很陌生。我会尝试寻找如何在熊猫中创建范围,也许这会有所帮助?还有其他想法吗?谢谢
    • 好的。此错误是由列转换器引发的,它在处理 pandas DataFrame 时只能处理列字符串。因此,您不必为 xy 使用 numpy 数组。我编辑了我的答案。
    • 这应该正常工作,但我知道目标是多标签错误。一旦我将精度更改为微,就可以了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多