【问题标题】:Scikit learn + Pandas ValueError: shapes (1,1) and (10,10) not alignedScikit learn + Pandas ValueError:形状(1,1)和(10,10)未对齐
【发布时间】:2019-04-20 16:10:32
【问题描述】:

我在使用 SciKit Learn 时遇到问题。

我正在做一个非常简单的线性回归问题。根据学习时间的输入值和由此产生的成绩,我希望能够根据学生的学习时间来估计他们的成绩。

In [1]: import pandas as pd
In [2]: path = 'Desktop/hoursgrades.csv'
In [3]: df = pd.read_csv(path)
In [4]: X = df['Hours Studied']
In [5]:  y = df['Grade']
In [6]: training_data_in = list() 
In [7]: training_data_out = list()
In [8]: training_data_in.append(X)
In [9]: training_data_out.append(y)  
In [11]: from sklearn.linear_model import LinearRegression
In [12]: model = LinearRegression(n_jobs =-1) 
In [13]: model.fit(X = training_data_in, y = training_data_out)
Out[13]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=-1, normalize=False)

在本例中,DF 如下所示:

In [16]: df
Out[16]: 
   Hours Studied  Grade
0              1   10.0
1              2   20.0
2              3   30.0
3              4   40.0
4              5   50.0
5              6   60.0
6              7   70.0
7              8   80.0
8              9   90.0
9             10  100.0

X 看起来像这样:

In [17]: X
Out[17]: 
0     1
1     2
2     3
3     4
4     5
5     6
6     7
7     8
8     9
9    10
Name: Hours Studied, dtype: int64

而 y 看起来像这样:

In [18]: y
Out[18]: 
0     10.0
1     20.0
2     30.0
3     40.0
4     50.0
5     60.0
6     70.0
7     80.0
8     90.0
9    100.0
Name: Grade, dtype: float64

到目前为止一切顺利,它似乎已经接受了我迄今为止所投入的一切。所以现在,我想用一些输入数据来测试模型。所以,我想说,这个学生学习的小时数是 5 & 让模型告诉我预期的成绩。

但是当我把它放到模型中时,我得到了以下错误。

谁能给点建议?

In [14]: studied_hour = [[5]]

In [15]: outcome = model.predict(X = studied_hour)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-6fdab4ae2efd> in <module>()
----> 1 outcome = model.predict(X = studied_hour)

~/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/base.py in predict(self, X)
    254             Returns predicted values.
    255         """
--> 256         return self._decision_function(X)
    257 
    258     _preprocess_data = staticmethod(_preprocess_data)

~/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/base.py in _decision_function(self, X)
    239         X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])
    240         return safe_sparse_dot(X, self.coef_.T,
--> 241                                dense_output=True) + self.intercept_
    242 
    243     def predict(self, X):

~/anaconda3/lib/python3.7/site-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output)
    138         return ret
    139     else:
--> 140         return np.dot(a, b)
    141 
    142 

ValueError: shapes (1,1) and (10,10) not aligned: 1 (dim 1) != 10 (dim 0)

我应该补充:

In [39]: X.shape
Out[39]: (10,)

In [40]: y.shape
Out[40]: (10,)

【问题讨论】:

    标签: python python-3.x pandas machine-learning scikit-learn


    【解决方案1】:

    Xy 的输入形状都不正确,根据 docsX(n_samples,)y 必须是 (n_samples, n_features)。

    您看到错误是因为模型认为您有十个特征和十个不同的输出(因此是 (10, 10))。

    你得到正确的结果使用

    X = df[['Hours Studied']]  # note the double brackets, shape (10, 1)
    y = df['Grade']
    model = LinearRegression().fit(X, y)
    
    model.predict([[5]])
    array([50.])
    

    【讨论】:

    • 谢谢!! - 你能再解释一下为什么X的定义需要双括号吗?
    • @kikee1222 用于选择列列表(此处长度为 1),以便选择生成数据框而不是系列(二维数组而不是 1d)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2016-05-04
    • 2022-12-07
    • 2017-05-07
    • 2019-06-03
    • 2018-03-06
    相关资源
    最近更新 更多