用 pandas DataFrame 中的数据拟合 sklearn 的 SVM 分类器

Posted

技术标签:

【中文标题】用 pandas DataFrame 中的数据拟合 sklearn 的 SVM 分类器【英文标题】:Fitting sklearn's SVM classifier with data from a pandas DataFrame 【发布时间】:2018-03-15 08:54:22 【问题描述】:

我正在尝试使用 SVM,但是当我使用 pandas 数据框时,我不知道如何拟合模型。如果我的数据如下所示:

df = pd.DataFrame("x": ['011', '100', '111'] , "y": [0,1,0])
df.x.apply(lambda x: np.array(list(map(int,x))))
>>>df
    x           y
0   [0, 1, 1]   0
1   [1, 0, 0]   1
2   [1, 1, 1]   0

如果我尝试以这种方式拟合模型:

clf = svm.SVC().fit(df.x, df.y)

我收到此错误:

ValueError: setting an array element with a sequence.

使用此数据框拟合 SVM 的正确方法是什么?

【问题讨论】:

【参考方案1】:
import numpy as np
from sklearn.svm import SVC

# Convert your data frame's columns into arrays
features = df['x'].to_numpy()
labels = df['y'].to_numpy()

# feed into your classifier 
SVC().fit(features,labels)

【讨论】:

尝试向用户解释他的代码中存在什么问题以及为什么您的解决方案可以解决它。【参考方案2】:

另一种解决方案是下面的代码。

import pandas as pd
import numpy as np

from sklearn.svm import SVC

df = pd.DataFrame("x": ['011', '100', '111'] , "y": [0,1,0])
x = df.x.apply(lambda x: pd.Series(list(x)))
x
# Out[2]:
#    0  1  2
# 0  0  1  1
# 1  1  0  0
# 2  1  1  1

SVC().fit(x, df.y)
# Out[3]:
# SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
#   decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
#   max_iter=-1, probability=False, random_state=None, shrinking=True,
#   tol=0.001, verbose=False)

【讨论】:

是的,这是我在 cmets 中提到的另一种选择,但忽略了作为答案。 +1【参考方案3】:
df = pd.DataFrame("x": ['011', '100', '111'] , "y": [0,1,0])
df.x = df.x.apply(lambda x: list(map(int,x)))

df
           x  y
0  [0, 1, 1]  0
1  [1, 0, 0]  1
2  [1, 1, 1]  0

df.x 是一列数组。这可能不是存储数据的最佳方式,而且sklearn 似乎不太擅长理解它。将所有内容转换为列表列表并将 that 传递给SVC 会更简单。试试这个:

x = df.x.tolist()
print(x)
[[0, 1, 1], [1, 0, 0], [1, 1, 1]]
SVC().fit(x, df.y)

【讨论】:

非常感谢,但是我们可以使用 numpy 数组而不是列表列表吗?因为当我们有一个大数据集时,numpy 数组比列表列表要快得多? @Ali sklearn 很棒。将列表或 numpy 数组传递给 sklearn 没有区别。 @Ali SVC 会为你把它变成一个数组。但是,您可以通过不以这种方式存储输入数组来提高流程效率。 @piRSquared 假设 x 是图像的像素,y 是类,有什么比我上面的方法更好的存储此类数据的方法? @Ali 为每一位分隔列?

以上是关于用 pandas DataFrame 中的数据拟合 sklearn 的 SVM 分类器的主要内容,如果未能解决你的问题,请参考以下文章

Pandas库中的DataFrame

pandas的DataFrame对象抽取“整列”或者“整行”数据

从 pandas DataFrame 中的列中提取 JSON 数据

Pandas Dataframe 中的索引行不在索引列表中(Python)[重复]

用字典值替换 Pandas Dataframe 中的部分字符串

迭代和编写Pandas Dataframe NaNs回MySQL