在sklearn中使用10折交叉验证的SVM回归模型中,如何处理分类(字符串)特征?

3

我有一个包含不同类型特征的csv文件(分类字符串、0-1二进制、浮点数)。我想进行10折交叉验证的SVM回归。根据这篇文章,我尝试了以下方法来读取数据,但是出现了无法将字符串转换为浮点数的错误:

df = pd.read_csv("output.csv")
datanumpy = df.as_matrix()
x = datanumpy[:, 0:143]  # select columns 1 through 41 (the features)
y = datanumpy[:, 144]  # select column 42 (the labels)


clf = SVC(kernel='linear')

clf.fit(x, y)

你有什么想法可以处理这些因素吗?

错误消息是:

ValueError                                Traceback (most recent call last)
<ipython-input-22-731136d5a713> in <module>()
     75 
     76 # # fitting x samples and y classes
---> 77 clf.fit(x, y)
     78 
     79 

/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/svm/base.py in fit(self, X, y, sample_weight)
    149         self._sparse = sparse and not callable(self.kernel)
    150 
--> 151         X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
    152         y = self._validate_targets(y)
    153 

/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    519     X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite,
    520                     ensure_2d, allow_nd, ensure_min_samples,
--> 521                     ensure_min_features, warn_on_dtype, estimator)
    522     if multi_output:
    523         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    380                                       force_all_finite)
    381     else:
--> 382         array = np.array(array, dtype=dtype, order=order, copy=copy)
    383 
    384         if ensure_2d:

ValueError: could not convert string to float: '/Users/dorien/AC/Projects/memory/S1 - Stimuli/Exp1-2-Stimuli/MIDI/Stimulus9.mid'

我需要指出哪些列是因素吗?


提供数据样本和完整的错误信息。 - Sociopath
还要注意,您当前的切片操作会丢失一列数据。由于Python的切片操作是不包含右端点的,因此datanumpy[:,0:143]只会返回从第0列到第142列的数据,而datanumpy[:,144]则会选择第144列的数据,这样就忽略了第143列的数据。 - dennlinger
1
谢谢提醒。实际上我想跳过第143列,因为它是第二个要在第二次实验中检查的目标变量。 - dorien
@AkshayNevrekar 我已更新问题并包含错误信息。 - dorien
1
使用 pd.dummies()labelEncoder() 来处理非数字数据。 - Sociopath
显示剩余3条评论
2个回答

3

由于机器学习算法只接受数字数据,因此首先将文本数据转换为数字非常重要。

在Python中,有两种方法可以做到这一点。

第一种方法是使用 LabelEncoder()

from sklearn.preprocessing import LabelEncoder

df = df.apply(LabelEncoder().fit_transform)  

另一种方法是使用 pandas.get_dummies() 来完成这个任务。
import pandas as pd

df_dummies = pd.get_dummies(df, columns=categorical_columns, drop_first=True)

在上面的例子中,categorical_columns 是一个分类变量列表。

0

SVMs 无法处理分类数据,您需要使用一些技术进行预处理,如独热编码(或适合您的数据的其他方法)


我明白了。那么对于0-1二元数据呢?我应该让SVM将其视为整数吗?从统计学角度来看,这似乎不正确。 - dorien
如果我想进行逻辑回归或线性回归怎么办?在R中,我可以使用factor命令将某些变量标记为分类变量。Python有类似的功能吗? - dorien
你可以使用许多不同的技术,这主要取决于你要处理的数据。看一下这篇文章,它将帮助你理解问题的复杂性,并提供一些有用的示例:https://towardsdatascience.com/understanding-feature-engineering-part-2-categorical-data-f54324193e63。是的,在Pandas库中存在factor命令,你可以使用df['my-column'].astype('category').cat.codes.values来转换列。 - m33n
我主要是不知道如何使用Python库。我该如何告诉它将其视为分类变量?在R中,我只需使用factor函数即可。 - dorien
你的代码中使用了pandas(几乎在你提供的示例中都有)。在第一行中,你使用pandas库读取了一个csv文件,之后你可以通过列名访问任何一列,例如df['column-name']。因此,你可以选择你想要的列并应用之前的转换。 - m33n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接