我在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上的管道,我认为它们比很多乱七八糟的代码更优雅。你可以把预处理和建模步骤放在同一个流水线上,例如: