pandas 如何摆脱错误“无法将字符串转换为浮点数”?

6g8kf2rb  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(172)

目前试图测试我的模型与其余30%的数据,并显示测试结果,但似乎无法测试它

from sklearn.model_selection import train_test_split
x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3)

from sklearn.linear_model import LinearRegression
MLmodel = LinearRegression()

MLmodel.fit(x_training_data, y_training_data)
pd.DataFrame(MLmodel.coef_, x.columns, columns = ['Coeff'])
dl5txlt9

dl5txlt91#

IIUC,您 * 至少 * 有一列需要用factorize编码为数字。
我做了下面的例子来向你展示一般的逻辑(* 基于你的输入 *):

df = pd.DataFrame({
    "gender": ["Male", "Female", "Male", "Female"],
    "age": [25, 32, 47, 19],
    "income": [50000, 75000, 100000, 30000],
    "location": ["New York", "Los Angeles", "Chicago", "Houston"],
    "sales": [100, 200, 300, 400]
})
    
df[["gender", "location"]] = (df[["gender", "location"]]
                                .apply(lambda x: pd.factorize(x)[0])) # <-- add this line

x, y = df.drop("sales", axis=1), df["sales"]

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size=0.3)

MLmodel = LinearRegression()
MLmodel.fit(x_training_data, y_training_data)

df = pd.DataFrame(MLmodel.coef_, x.columns, columns=["Coeff"])

输出:

print(df)

LinearRegression
LinearRegression()
                 Coeff
gender    2.040816e-08
age      -5.714285e-07
income   -1.428571e-03
location  2.040816e-08
i7uq4tfw

i7uq4tfw2#

分类数据编码

大多数机器学习模型只接受数字数据,例如:它们不接受字符串或任何其他数据格式作为输入。因此,您必须将数据从初始数据格式/表示 * 编码 * 为数字表示。

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import numpy as np

MLmodel = LinearRegression()

x_data = pd.DataFrame({
  "gender": ["Male", "Female", "Male", "Female"],
  "income": ["50000", "75000", "100000", "30000"],
  "location": ["New York", "Los Angeles", "Chicago", "Houston"],
  "sales": [100, 200, 300, 400]
})

y_data = [0, 1, 0, 1]

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3)

MLmodel.fit(x_training_data, y_training_data)
pd.DataFrame(MLmodel.coef_, x_data.columns, columns = ['Coeff'])

这将给予你一个类似的错误,因为你的列“性别”,“收入”,“位置”没有用数字表示,这是线性模型所需要的。

标签编码

有几种方法可以对数据进行编码,最简单的一种称为“标签编码”,您可以将变量中的每个类别表示为数字。例如,在性别变量中,我们可以使用0表示男性,1表示女性。同样,对于位置,“纽约”将表示为0,洛杉矶为1,“芝加哥”为2,“Houston”乘以3。那么您的 Dataframe 将如下所示:

x_data = pd.DataFrame({
  "gender": [0, 1, 0, 1],
  "income": ["50000", "75000", "100000", "30000"],
  "location": [0, 1, 2, 3],
  "sales": [100, 200, 300, 400]
})

y_data = [0, 1, 0, 1]

x_data["income"]=x_data["income"].astype(np.int32)
x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3)

MLmodel.fit(x_training_data, y_training_data)
pd.DataFrame(MLmodel.coef_, x_data.columns, columns = ['Coeff'])

你还应该注意变量的数据类型,例如income是一个数值变量,但是它在我们的dataframe中被表示为字符串。你可以使用x_data.dtypes来查看每个变量/列的数据类型

x_data.dtypes

将输出以下内容:

gender      int64
income      int32
location    int64
sales       int64
dtype: object

一次热编码

然而,这并不总是编码数据的最佳方式,因为它假设类别之间存在顺序关系(3大于0),但对于某些类别特征没有意义。

x_data_new = pd.get_dummies(x_data)
x_data_new

现在你的x_data_new看起来像这样:
| 指数|销售|性别_女性|性别_男|收入_100000|收入_30000|收入_50000|收入_75000|位置_芝加哥|位置_休斯顿|位置_洛杉矶|地点_纽约||
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 0|一百|0|1|0|0|1|0|0|0|0|1||
| 1|两百|1|0|0|0|0|1|0|0|1|0||
| 二|三百|0|1|1|0|0|0|1|0|0|0||
| 三|四百|1|0|0|1|0|0|0|1|0|0||
同样,这只适用于某些用例,假设您有一个包含数千或数百万类别的变量/列,它将导致您的输入数据具有大量的行。这就是为什么有其他编码类型(频率编码,目标编码等)。

相关问题