【问题标题】:Categorical (string) features in sklearn for 10cv SVM regressionsklearn 中用于 10cv SVM 回归的分类(字符串)特征
【发布时间】:2019-01-04 06:04:02
【问题描述】:

我在 csv 文件中混合了不同类型的功能(分类字符串、0-1 二进制、浮点数)。我想用 10 倍交叉验证进行 SVM 回归。基于this post,我尝试了以下读取数据,但我得到一个错误,字符串不能转换为浮点数:

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'

我应该指出哪些列是因子?

【问题讨论】:

  • 提供数据样本和完整的错误信息。
  • 另外请注意,您正在使用当前切片删除一列。由于 Python 不包含在内,datanumpy[:,0:143] 将仅返回列 0 到 142,而datanumpy[:,144] 将选择列 144,因此您将忽略列 143。
  • 感谢您的提醒。我实际上想跳过第 143 列,因为它是在第二个实验中检查的第二个目标变量。
  • @AkshayNevrekar 我已更新问题以包含错误消息。
  • 使用pd.dummies()labelEncoder() 处理非数字数据。

标签: python scikit-learn svm


【解决方案1】:

由于机器学习算法只接受数字数据,因此首先将文本数据转换为数字非常重要。 在 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 是一个分类变量列表。

【讨论】:

    【解决方案2】:

    SVM 无法处理分类数据,您需要使用某种技术对其进行预处理,作为一种热编码(或任何适合您数据的方法)

    【讨论】:

    • 我明白了。那么 0 - 1 的分类数据呢?我应该让 SVM 将其视为整数吗?从统计的角度来看似乎不正确。
    • 如果我想做逻辑回归或线性回归怎么样。在 R 中,我可以使用 factor 命令将某些变量标记为分类变量。 Python有类似的东西吗?
    • 您可以使用许多不同的技术。这主要取决于您要使用的数据。看看这篇文章,它将帮助您了解问题的复杂性,并提供一些有用的示例towardsdatascience.com/…。是的,Pandas 库中存在 factor 命令,您可以使用 df['my-column'].astype('category').cat.codes.values 转换列
    • 我主要是不知道如何使用python库。我如何告诉它将其视为分类。在 R 中,我可以只使用因子函数。
    • 您在代码中使用了 pandas(几乎在您提供的示例中)。在第一行中,您使用 pandas 库读取了一个 csv 文件,之后您可以使用其列名访问任何列,例如 df['column-name']。因此,您可以选择所需的列并应用之前的转换。
    猜你喜欢
    • 2018-11-29
    • 2012-03-13
    • 2014-01-19
    • 2018-08-18
    • 2016-03-04
    • 2019-11-24
    • 2023-03-25
    相关资源
    最近更新 更多