【问题标题】:Passing a list of vars to a ridge.fit() -- unhashable type?将变量列表传递给 ridge.fit() - 不可散列的类型?
【发布时间】:2014-09-09 14:13:13
【问题描述】:

我有一个名为 training 的数据集,它是在使用 Pandas 进行操作时读取的。大约有 150 个变量,所以我将它们放在一个列表中,我想将它们传递给岭回归;但是,我收到一条错误消息“不可散列的类型:列表”

我可能遗漏了一些明显的东西,因为这是我第一次使用 python(用于 R 和 Stata)。

代码如下:

  # Variables to use (potentially) -- for dummies, one has already been taken out to avoid dummy var trap
continuous_vars = ['VehicleAge','VehOdo', 'MMRAcquisitionAuctionAveragePrice', 'MMRAcquisitionAuctionCleanPrice', 'MMRAcquisitionRetailAveragePrice', 'MMRAcquisitonRetailCleanPrice', 'MMRCurrentAuctionAveragePrice', 'MMRCurrentAuctionCleanPrice', 'MMRCurrentRetailAveragePrice', 'MMRCurrentRetailCleanPrice', 'VehBCost', 'IsOnlineSale', 'WarrantyCost', 'reliability_score', 'num_bought']
make_cats = ['BUICK', 'CADILLAC', 'CHEVROLET', 'CHRYSLER', 'DODGE', 'FORD', 'GMC', 'HONDA', 'HUMMER', 'HYUNDAI', 'INFINITI', 'ISUZU', 'JEEP', 'KIA', 'LEXUS', 'LINCOLN', 'MAZDA', 'MERCURY', 'MINI', 'MITSUBISHI', 'NISSAN', 'OLDSMOBILE', 'PLYMOUTH', 'PONTIAC', 'SATURN', 'SCION', 'SUBARU', 'SUZUKI', 'TOYOTA', 'TOYOTA SCION', 'VOLKSWAGEN', 'VOLVO']
state_cats = ['AR', 'AZ', 'CA', 'CO', 'FL', 'GA', 'IA', 'ID', 'IL', 'IN', 'KY', 'LA', 'MA', 'MD', 'MI', 'MN', 'MO', 'MS', 'NC', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'SC', 'TN', 'TX', 'UT', 'VA', 'WA', 'WV']
auction_cats = ['ADESA', 'MANHEIM', 'OTHER']
trans_cats = ['AUTO']
color_cats = ['BEIGE', 'BLACK', 'BLUE', 'BROWN', 'GOLD', 'GREEN', 'GREY', 'MAROON', 'NOT AVAIL', 'ORANGE', 'OTHER', 'PURPLE', 'RED', 'SILVER', 'WHITE', 'YELLOW']
wheel_cats = ['Alloy', 'Covers', 'Special']
nat_cats = ['AMERICAN', 'OTHER', 'OTHER ASIAN', 'TOP LINE ASIAN']
size_cats =['COMPACT', 'CROSSOVER', 'LARGE', 'LARGE SUV', 'LARGE TRUCK', 'MEDIUM', 'MEDIUM SUV', 'SMALL SUV', 'SMALL TRUCK', 'SPECIALTY', 'SPORTS', 'VAN']
year_cats = ['2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010_x']

all_vars = continuous_vars + make_cats + state_cats + auction_cats + trans_cats + color_cats + wheel_cats + nat_cats + size_cats + year_cats
hashable = all_vars
## Ridge Regression 
ridge_reg = Ridge(alpha=1)

ridge_reg.fit(training[hashable], training['IsBadBuy'])

更新 我更新了代码以反映一些建议。这是新的错误消息:

  File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1068, in _convert_to_indexer
    raise KeyError('%s not in index' % objarr[mask])
KeyError: "['reliability_score' 'num_bought' 'BUICK' 'CADILLAC' 'CHEVROLET' 'CHRYSLER'\n 'DODGE' 'FORD' 'GMC' 'HONDA' 'HUMMER' 'HYUNDAI' 'INFINITI' 'ISUZU' 'JEEP'\n 'KIA' 'LEXUS' 'LINCOLN' 'MAZDA' 'MERCURY' 'MINI' 'MITSUBISHI' 'NISSAN'\n 'OLDSMOBILE' 'PLYMOUTH' 'PONTIAC' 'SATURN' 'SCION' 'SUBARU' 'SUZUKI'\n 'TOYOTA' 'TOYOTA SCION' 'VOLKSWAGEN' 'VOLVO' 'AR' 'AZ' 'CA' 'CO' 'FL' 'GA'\n 'IA' 'ID' 'IL' 'IN' 'KY' 'LA' 'MA' 'MD' 'MI' 'MN' 'MO' 'MS' 'NC' 'NE' 'NH'\n 'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'SC' 'TN' 'TX' 'UT' 'VA' 'WA' 'WV'\n 'ADESA' 'MANHEIM' 'OTHER' 'AUTO' 'BEIGE' 'BLACK' 'BLUE' 'BROWN' 'GOLD'\n 'GREEN' 'GREY' 'MAROON' 'NOT AVAIL' 'ORANGE' 'OTHER' 'PURPLE' 'RED'\n 'SILVER' 'WHITE' 'YELLOW' 'Alloy' 'Covers' 'Special' 'AMERICAN' 'OTHER'\n 'OTHER ASIAN' 'TOP LINE ASIAN' 'COMPACT' 'CROSSOVER' 'LARGE' 'LARGE SUV'\n 'LARGE TRUCK' 'MEDIUM' 'MEDIUM SUV' 'SMALL SUV' 'SMALL TRUCK' 'SPECIALTY'\n 'SPORTS' 'VAN' '2001' '2002' '2003' '2004' '2005' '2006' '2007' '2008'\n '2009' '2010_x'] not in index"

【问题讨论】:

  • 我注意到 KeyError 输出中有一些 \n。你可能会调查这些是从哪里来的。
  • 您不需要创建临时文件来保存结果,您可以使用print(all_vars) 的结果编辑您的问题吗,您似乎已经为克莱斯勒、吉普车嵌入了\n , 2008 ..等
  • 您还可以从training.info()training.columns 打印输出吗?您的列名可能嵌入了\n 或与您尝试的列之一不匹配,您可以尝试每个对每一轮进行分组以查看它们是否作为列选择工作
  • 与其用另一个问题更新这个问题,为什么不接受对您有帮助的答案,并提出一个新问题呢?这样对每个人都更好!

标签: python pandas scikit-learn modeling


【解决方案1】:

您所做的是创建一个列表列表,您希望将它们全部连接起来:

all_vars = continuous_vars+ make_cats+ state_cats+ auction_cats+ trans_cats+ color_cats+ wheel_cats+ nat_cats+ size_cats+ year_cats

这将正确地从 pandas 中选择特征列

比较以下:

In [84]:

[auction_cats, wheel_cats]
Out[84]:
[['ADESA', 'MANHEIM', 'OTHER'], ['Alloy', 'Covers', 'Special']]
In [85]:

auction_cats+wheel_cats
Out[85]:
['ADESA', 'MANHEIM', 'OTHER', 'Alloy', 'Covers', 'Special']

【讨论】:

  • 所以我修复了这个问题并使用了 Haseeb ur Ra​​hman 的建议,但我遇到了一个新错误。我已经用新的代码和错误更新了我的帖子。谢谢!
【解决方案2】:

几天前我遇到了同样的问题。事实证明,您不能将列表类型用作字典中的键。我通过将列表元素分配给一个新变量并将该变量用作键来解决这个问题。

hashableVar = all_vars
training[hashableVar]

【讨论】:

  • 这对我不起作用,但可能是因为另一个不相关的错误。我已经用新的错误消息更新了我的代码。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2017-07-11
  • 2015-01-07
  • 1970-01-01
  • 2020-05-07
  • 2018-02-22
  • 2020-03-28
  • 2010-12-13
相关资源
最近更新 更多