无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵
Posted
技术标签:
【中文标题】无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵【英文标题】:Unable to transform string column to categorical matrix using Keras and Sklearn 【发布时间】:2018-05-14 08:56:42 【问题描述】:我正在尝试在 MacOS 上使用 Python3.6 构建一个简单的 Keras 模型来预测给定范围内的房价,但我未能将输出转换为类别矩阵。我正在使用来自 Kaggle 的this dataset。
我在数据框中创建了一个具有不同价格范围的新列作为字符串作为模型中的目标输出,然后使用 keras.utils 和 Sklearn LabelEncoder 尝试创建输出二进制矩阵,但我不断收到错误消息:
ValueError: invalid literal for int() with base 10: '0 - 50000'
这是我的代码:
import pandas as pd
import numpy as np
from keras.layers import Dense
from keras.models import Sequential, load_model
from keras.callbacks import EarlyStopping
from keras.utils import to_categorical, np_utils
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
seed = 7
np.random.seed(seed)
data = pd.read_csv("Melbourne_housing_FULL.csv")
data.fillna(0, inplace=True)
price_range = 50000
bins = np.arange(0, 12000000, price_range)
labels = [' - '.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])]
#correct first value
labels[0] = '0 - 50000'
for item in labels:
str(item)
print (labels[:10])
['0 - 50000', '50001 - 100000', '100001 - 150000', '150001 - 200000',
'200001 - 250000', '250001 - 300000', '300001 - 350000', '350001 - 400000',
'400001 - 450000', '450001 - 500000']
data['PriceRange'] = pd.cut(data.Price,
bins=bins,
labels=labels,
right=True,
include_lowest=True)
#print(data.PriceRange.value_counts())
output_len = len(labels)
print(output_len)
在我运行下一段之前,这里的一切都是正确的:
predictors = data.drop(['Suburb', 'Address', 'SellerG', 'CouncilArea',
'Propertycount', 'Date', 'Type', 'Price', 'PriceRange'], axis=1).as_matrix()
target = data['PriceRange']
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(target)
encoded_Y = encoder.transform(target)
target = np_utils.to_categorical(data.PriceRange)
n_cols = predictors.shape[1]
我得到 ValueError: invalid literal for int() with base 10: '0 - 50000'
这里有人帮我吗?真的不明白我做错了什么。
非常感谢
【问题讨论】:
【参考方案1】:这是因为np_utils.to_categorical
采用 y 的数据类型 int,但是您有字符串,要么通过给它们一个键将它们转换为 int,即:
cats = data.PriceRange.values.categories
di = dict(zip(cats,np.arange(len(cats))))
#'0 - 50000': 0,
# '10000001 - 10050000': 200,
# '1000001 - 1050000': 20,
# '100001 - 150000': 2,
# '10050001 - 10100000': 201,
# '10100001 - 10150000': 202,
target = np_utils.to_categorical(data.PriceRange.map(di))
或者由于您使用的是 pandas,您可以使用 pd.get_dummies
来获得一种热编码。
onehot = pd.get_dummies(data.PriceRange)
target_labels = onehot.columns
target = onehot.as_matrix()
array([[ 1., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 1., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]])
【讨论】:
【参考方案2】:只有一行代码
tf.keras.utils.to_categorical(data.PriceRange.factorize()[0])
【讨论】:
以上是关于无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mlflow.pyfunc.log_model() 通过 Keras 步骤记录 sklearn 管道?类型错误:无法腌制 _thread.RLock 对象