Python的"StandardScaler"和"LabelEncoder","fit"和"fit_transform"不适用于同时包含浮点数和字符串的CSV。



我在Google协作实验室学习MPL回归器并运行源代码:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data = np.array(table)
scaler.fit(data)
y_index = data.shape[1]-1
sd_x = (scaler.var_[:y_index])**0.5
sd_y = (scaler.var_[y_index])**0.5
mean_x = scaler.mean_[:y_index]
mean_y = scaler.mean_[y_index]

x = (data[:, :y_index]).astype(np.float32)
y = (data[:, y_index]).astype(np.float32)
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.25)
print('Separate training and testing sets!')

给出错误ValueError: could not convert string to float: 'Photo Editor & Candy Camera & Grid & ScrapBook'

所以我检查了问题RandomForestClassfier.fit(): ValueError:无法将字符串转换为float。我还尝试了sklearn-LinearRegression:无法将字符串转换为float: '——'

我将fit(data)改为fit_transform(data),但同样的错误仍然存在。然后我从StandardScaler变成LabelEncoder,从scaler = StandardScaler()变成scaler = LabelEncoder()。但是出现了不同的错误:ValueError: bad input shape (10841, 13)出现在scaler.fit_transform(data).

你可以在这里查看Kaggle的CSV文件。CSV包含字符串和不带双引号的数字(包含双引号的价格除外)。

来自sklearn的LabelEncoder的文档:这个转换器应该用于编码目标值,即y,而不是输入x。

特别是,它不打算在完整的数据集上适合LabelEncoder

如果您只想用唯一的和数字的id替换分类(即字符串值)列的值,一种方法是在您想要单独编码的每个列上应用标签编码器(在拆分数据之前)。当您的示例代码导入pandas时,我假设您的数据已加载到pandas.DataFrame中,如

df = pd.read_csv('/path/to/googleplaystore.csv')

从那里,您可以在每个列上应用编码器:

df['App'] = LabelEncoder().fit_transform(df['App'].values)

您可能还想了解如何处理pandas中的分类数据。

然而,即使在对数据集中的每个非数字列这样做之后,在对编码的数据拟合模型之前还有很长的路要走(您可能希望随后对这些列应用one-hot编码,但这在很大程度上取决于您想要使用的模型)。

StandardScaler是来自sklearn的预处理类,它接受数值条目并将它们转换为具有0均值和单位方差的可能高斯分布。它不处理文本数据。这解释了第一个错误。

LabelEncoder是来自sklearn的另一个预处理类,它获取数据并将其映射为数字编码表示。例:["apple","banana","apple","banana"]到[0,1,0,1]

你的数据集有缺失值,你应该先处理它们。通过imputing, drop或其他类似的方法。

然后,您应该转换每个列的类型(除了评级之外都被认为是对象或字符串),以正确处理每个数据类型。

table = pd.read_csv('googleplaystore.csv')
# check dataset info
table.info()
# check missing values
table.isna().sum()

老实说,我认为这与其说是技术问题,不如说是概念问题。正如其他用户告诉您的那样,StandarScaler必须用于数字列,但大多数数据框列都是object类型。也许你应该在它上面使用OneHotEncoder,所有sklearn上的变压器都有类似的行为。

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown='ignore')
ohe.fit_transform(X)  # your data without target column
# ...blabla...

最后,我推荐你阅读sklearn上的管道,我认为它们比很多乱七八糟的代码更优雅。你可以把预处理和建模步骤放在同一个流水线上,例如:

相关内容

  • 没有找到相关文章

最新更新