【问题标题】:Pandas + sklearn Linear regression failsPandas + sklearn 线性回归失败
【发布时间】:2015-11-20 22:01:25
【问题描述】:

我正在尝试在 Python 中实现一些线性回归模型。请参阅下面的代码,我用它来进行线性回归。

import pandas
salesPandas = pandas.DataFrame.from_csv('home_data.csv')

# check the shape of the DataFrame (rows, columns)
salesPandas.shape
(21613, 20)

from sklearn.cross_validation import train_test_split

train_dataPandas, test_dataPandas = train_test_split(salesPandas, train_size=0.8, random_state=1)

from sklearn.linear_model import LinearRegression

reg_model_Pandas = LinearRegression()

print type(train_dataPandas)
print train_dataPandas.shape
<class 'pandas.core.frame.DataFrame'>
(17290, 20)

print type(train_dataPandas['price'])
print train_dataPandas['price'].shape
<class 'pandas.core.series.Series'>
(17290L,)

X = train_dataPandas
y = train_dataPandas['price']
reg_model_Pandas.fit(X, y)

我执行完上面的python代码后,出现如下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-dc363e199032> in <module>()
      3 X = train_dataPandas
      4 y = train_dataPandas['price']
----> 5 reg_model_Pandas.fit(X, y)

C:\Users\...\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\linear_model\base.py in fit(self, X, y, n_jobs)
    374             n_jobs_ = self.n_jobs
    375         X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
--> 376                          y_numeric=True, multi_output=True)
    377 
    378         X, y, X_mean, y_mean, X_std = self._center_data(

C:\Users\...\AppData\Local\Continuum\Anaconda2\lib\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)
    442     X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite,
    443                     ensure_2d, allow_nd, ensure_min_samples,
--> 444                     ensure_min_features)
    445     if multi_output:
    446         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

C:\Users\...\AppData\Local\Continuum\Anaconda2\lib\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)
    342             else:
    343                 dtype = None
--> 344         array = np.array(array, dtype=dtype, order=order, copy=copy)
    345         # make sure we actually converted to numeric:
    346         if dtype_numeric and array.dtype.kind == "O":

ValueError: invalid literal for float(): 20140610T000000

train_dataPandas.info() 的输出

<class 'pandas.core.frame.DataFrame'>
Int64Index: 17290 entries, 4058200630 to 1762600320
Data columns (total 20 columns):
date             17290 non-null object
price            17290 non-null int64
bedrooms         17290 non-null int64
bathrooms        17290 non-null float64
sqft_living      17290 non-null int64
sqft_lot         17290 non-null int64
floors           17290 non-null float64
waterfront       17290 non-null int64
view             17290 non-null int64
condition        17290 non-null int64
grade            17290 non-null int64
sqft_above       17290 non-null int64
sqft_basement    17290 non-null int64
yr_built         17290 non-null int64
yr_renovated     17290 non-null int64
zipcode          17290 non-null int64
lat              17290 non-null float64
long             17290 non-null float64
sqft_living15    17290 non-null int64
sqft_lot15       17290 non-null int64
dtypes: float64(4), int64(15), object(1)
memory usage: 2.8+ MB

【问题讨论】:

  • 错误很清楚,你的一列有一个无效的 dtype,它看起来像一个字符串,它们需要是数字才能与 sklearn 兼容,你能发布输出吗从train_dataPandas.info() 你可能需要转换dtypes
  • train_dataPandas.info()-输出已发布
  • 'date'列很可能是string dtype,需要转换一下,试试df['date'] = pd.to_datetime(df['date'], format='%Y%m%dT%H%M%s')
  • 格式字符串中的错字应为:df['date'] = pd.to_datetime(df['date'], format='%Y%m%dT%H%M%S')
  • 好的,不确定 sklearn 是否支持 datetime64,你可以通过总时间也许这样df['date'] = df['date'].dt.nanoseconds

标签: python pandas scikit-learn


【解决方案1】:

根据您的数据,另一种可能的解决方案是在从文件中读取日期时指定parse_dates

import pandas
salesPandas = pandas.read_csv('home_data.csv', parse_dates=['date'])

这会有所帮助的原因是,当您传递要拟合的数据时,您可以将其分解为月、小时、日。这是假设您的大部分数据都集中在前面提到的那些数据上而不是年份上(即您的总独特年份约为 3-4)

从这里您可以使用Datetimelike Properties 并通过salesPandas['date'].dt.month 调用月份,然后相应地替换日期和时间。

【讨论】:

    【解决方案2】:

    感谢 EdChum,到目前为止的解决方案如下:

    1. 首先我上传了数据
    2. salesPandas.info() 向我展示了
    Int64Index: 21613 entries, 7129300520 to 1523300157
    Data columns (total 20 columns):
    date 21613 non-null object
    

    这不好,因为 sklearn,不能使用日期作为对象

    1. 如果我做 salesPandas.head() 第一个元组的日期是

    20141013T000000

    你看到T了吗? ...糟糕

    1. sklearn.linear_model.LinearRegression().fit() 想要拥有 npy 数组(Pandas 是基于 numpy 构建的,因此 DataFrame 也是一个 numpy 数组)

    2. 所以先把对象转成datetime,再转成数字

    salesPandas['date'] = pandas.to_datetime(salesPandas['date'], 格式='%Y%m%dT%H%M%S')

    salesPandas['date'] = pandas.to_numeric(salesPandas['date'])

    1. 如果你那么

      reg_model_Pandas.fit(X, y)

    有效

    【讨论】:

    • 酷,记得接受你的回答(几天后),这样它就不会一直无人回答
    • 如果有人有更简单或更好的解决方案,请随时回复:)
    猜你喜欢
    • 2018-05-16
    • 2019-03-26
    • 1970-01-01
    • 2018-07-30
    • 2021-02-20
    • 2014-05-05
    • 2015-01-29
    • 2020-12-24
    • 2020-11-19
    相关资源
    最近更新 更多