【问题标题】:Iris decision tree in pythonpython中的鸢尾花决策树
【发布时间】:2021-07-01 12:40:21
【问题描述】:

我正在尝试了解决策树,但最终找到了一篇有关决策树的文章。这篇文章的目的是确定一朵花是否是鸢尾花,但我似乎遇到了一些错误,我希望有人能回答我得到两个错误,如下所示:

iris: Bunch iris: inner_f 'tuple' 的实例没有'target' 成员

iris: Bunch iris: inner_f 'tuple' 的实例没有'data' 成员

我在 x = iris.data 行和 y = iris.target 行遇到这些错误。

代码如下:

import warnings
warnings.filterwarnings('ignore')

import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split

#load iris data
iris = datasets.load_iris()
x = iris.data
y = iris.target
d = [{"sepal_length":row[0], 
      "sepal_width":row[1], 
      "petal_length":row[2], 
      "petal_width":row[3]} for row in x]
df = pd.DataFrame(d) # construct dataframe
df["types"] = y # assign types
df = df.sample(frac=1.0) # random shuffle rows
df.head()

有人知道我为什么会收到这些错误吗?

【问题讨论】:

  • 这段代码对我来说没有产生任何错误。
  • 根据您的sklearn 的版本,return_X_y 有一个参数。请检查您从load.iris() 获得的数据类型。是元组还是数据框?

标签: python pandas dataframe scikit-learn decision-tree


【解决方案1】:

您的错误消息表明有问题的值 iris 是一个元组,它没有您引用的属性。检查您正在使用的工具的文档;他们应该解释如何将datasets.load_iris() 解压缩到您需要的对象中。

【讨论】:

    【解决方案2】:

    在大多数情况下,我不会过滤警告,因为您可以从警告中获得有用的信息。

    因此,sklearn 数据集格式是一个 Bunch,它是一个像字典一样工作的专用容器对象。您可以使用点符号访问它,例如iris.data 或字典符号,例如虹膜['数据']。在这里,不清楚你的机器上的错误是什么,因为我(像其他评论者一样)在 python 3.8.5 中访问 iris.data 或 iris['data'] 没有问题。

    我想让你知道几个地方可以改进你的方法:

    (1) 不清楚为什么需要构建数据框,因为您可以直接通过调用连接的 numpy 数组上的 train_test_split 来获取所需的样本,或者您可以直接从 numpy 数组中获取索引的随机样本。

    (2) 你构建数据框的方法比它需要的更复杂。

    import pandas as pd
    import numpy as np
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    
    # load iris data
    iris = datasets.load_iris()
    
    # train test split
    X_train, y_train, X_test, y_test = train_test_split(iris.data, iris.target)
    
    # random shuffle of data/target indices
    rng = np.random.default_rng()
    rng_size = iris.data.shape[0]
    idx_sample = rng.choice(np.arange(rng_size), size=rng_size, replace=False)
    
    # simpler way to create dataframe
    # concatenate along the columns (axis 1)
    # then set the column names in one place
    df = pd.concat([pd.DataFrame(iris.data), pd.DataFrame(iris.target)], axis=1)
    df.columns = ["sepal_length", "sepal_width", "petal_length", "petal_width", "types"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-23
      • 2019-03-06
      • 2021-08-23
      • 1970-01-01
      • 2020-10-10
      • 2015-01-05
      • 2016-03-12
      • 2021-08-19
      相关资源
      最近更新 更多