【问题标题】:scikit learn LinearRegression string predicted valuescikit learn LinearRegression 字符串预测值
【发布时间】:2017-03-08 00:00:43
【问题描述】:

在使用教程完成了一些课程和示例之后,我尝试创建我的第一个机器学习模型。我从这里得到了训练数据:https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv,我正在使用 panda 来加载这个 csv 数据。

主要问题是预测列是字符串,所有算法都使用浮点数。

当然,我可以手动映射所有带有数字 (0,1,2) 的字符串并使用更改的文件,但我尝试找出一种方法来使用 panda 或 scikit-learn 自动替换字符串值并将它们映射到单独的数组中.

我的代码是:

import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression

data = pd.read_csv("https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv")

data.head()

features_cols = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth']
X = df[features_cols]
y = data.Name

X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=1)
linreg = LinearRegression()
linreg.fit(X_train, y_train)

看到的错误是:

ValueError: could not convert string to float: 'Iris-setosa'

如何使用 panda 将“名称”列中的所有值替换为整数?

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    你可以使用scikit-learn的LabelEncoder

    >>> from pandas import pd
    >>> from sklearn import preprocessing
    >>> df = pd.DataFrame({'Name':['Iris-setosa','Iris-setosa','Iris-versicolor','Iris-virginica','Iris-setosa','Iris-versicolor'], 'a': [1,2,3,4,1,1]})
    >>> y = df.Name
    >>> le = preprocessing.LabelEncoder()
    >>> le.fit(y)  # fit your y array
    LabelEncoder()
    >>> le.classes_  # check your unique classes
    array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
    >>> y_transformed = le.transform(y)  # transform your y with numeric encodings
    >>> y_transformed
    array([0, 0, 1, 2, 0, 1], dtype=int64)
    

    【讨论】:

      【解决方案2】:

      我建议您像这样直接从 scikit-learn 导入 iris dataset

      from sklearn import datasets
      
      iris = datasets.load_iris()
      X = iris.data
      y = iris.target
      

      演示:

      In [9]: from sklearn.cross_validation import train_test_split
      
      In [10]: from sklearn.linear_model import LinearRegression
      
      In [11]: X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
      
      In [12]: linreg = LinearRegression()
      
      In [13]: linreg.fit(X_train, y_train)
      Out[13]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
      
      In [14]: linreg.score(X_test, y_test)
      Out[14]: 0.89946565707178838
      
      In [15]: y
      Out[15]: 
      array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
      

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 2021-11-22
        • 2015-03-11
        • 2020-05-09
        • 2018-02-03
        • 2018-02-22
        • 2015-12-19
        • 2018-01-09
        相关资源
        最近更新 更多