【问题标题】:issue in executing scikit-learn linear regression model执行 scikit-learn 线性回归模型的问题
【发布时间】:2015-12-15 01:26:40
【问题描述】:

我有一个数据集,其示例结构如下所示:

SV,Arizona,618,264,63,923
SV,Arizona,367,268,94,138
SV,Arizona,421,268,121,178
SV,Arizona,467,268,171,250
SV,Arizona,298,270,62,924
SV,Arizona,251,272,93,138
SV,Arizona,215,276,120,178
SV,Arizona,222,279,169,250
SV,Arizona,246,279,64,94
SV,Arizona,181,281,97,141
SV,Arizona,197,286,125.01,182
SV,Arizona,178,288,175.94,256
SV,California,492,208,63,923
SV,California,333,210,94,138
SV,California,361,213,121,178
SV,California,435,217,171,250
SV,California,222,215,62,92
SV,California,177,218,93,138
SV,California,177,222,120,178
SV,California,156,228,169,250
SV,California,239,225,64,94
SV,California,139,229,97,141
SV,California,198,234,125,182

记录的顺序是company_id,state,profit,feature1,feature2,feature3

现在我编写了这段代码,它将整个数据集分成 12 条记录的块(对于每个公司和该公司中的每个州都有 12 条记录),然后将其传递给 process_chunk() 函数。在process_chunk()内部,块中的记录被处理并分解为test settraining set,记录号为1011进入test set,其余进入training set。我还将test set 中的记录的company_idstate 存储到全局列表中,以便将来显示预测值。我还将预测值附加到全局列表final_prediction

现在我面临的问题是 company_liststate_listtest_set 列表的大小相同(大约 200 条记录),但 final_prediction 的大小是其他列表(100)条记录的一半.如果 test_set 列表的大小为 200,那么 final_prediction 不应该也是 200 的大小吗?我当前的代码是:

from sklearn import linear_model
import numpy as np
import csv

final_prediction = []
company_list = []
state_list = []

def process_chunk(chuk):

    training_set_feature_list = []
    training_set_label_list = []
    test_set_feature_list = []
    test_set_label_list = []
    np.set_printoptions(suppress=True)

    prediction_list = []


    # to divide into training & test, I am putting line 10th and 11th in test set
    count = 0
    for line in chuk:
        # Converting strings to numpy arrays
        if count == 9:   
            test_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            test_set_label_list.append(np.array(line[2],dtype = np.float))
            company_list.append(line[0])
            state_list.append(line[1])

        elif count == 10:
            test_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            test_set_label_list.append(np.array(line[2],dtype = np.float))
            company_list.append(line[0])
            state_list.append(line[1])

        else:    
            training_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            training_set_label_list.append(np.array(line[2],dtype = np.float))
        count += 1
    # Create linear regression object
    regr = linear_model.LinearRegression()
    # Train the model using the training sets
    regr.fit(training_set_feature_list, training_set_label_list)



    prediction_list.append(regr.predict(test_set_feature_list))
    np.set_printoptions(formatter={'float_kind':'{:f}'.format})
    for items in prediction_list:
        final_prediction.append(items)




# Load and parse the data
file_read = open('data.csv', 'r')

reader = csv.reader(file_read)

chunk, chunksize = [], 12

for i, line in enumerate(reader):
    if (i % chunksize == 0 and i > 0):
        process_chunk(chunk)
        del chunk[:]
    chunk.append(line)

# process the remainder

#process_chunk(chunk)


print len(company_list)
print len(test_set_feature_list)
print len(final_prediction)

为什么会出现这种大小差异以及我在代码中犯了哪些我可以纠正的错误(也许我做的很天真,可以以更好的方式完成)?

【问题讨论】:

  • 你为什么不用熊猫?它在 csv 阅读器中支持分块。

标签: python csv machine-learning scikit-learn linear-regression


【解决方案1】:

这里:

prediction_list.append(regr.predict(test_set_feature_list))
np.set_printoptions(formatter={'float_kind':'{:f}'.format})
for items in prediction_list:
    final_prediction.append(items)

prediction_list 将是一个数组列表(因为predict 返回一个数组)。

因此,您将向您的final_prediction 添加数组,这可能是您的计数混乱的原因:len(final_prediction) 可能等于块的数量。

此时,如果prediction_list 的长度与test_set_feature_list 的长度相同,则长度是可以的。

您可能想像这样使用extend

final_prediction.extend(regr.predict(test_set_feature_list))

这也更容易阅读。

那么final_prediction的长度应该没问题,应该是单个列表,而不是列表列表。

【讨论】:

  • 我的错误。这是我已更正的类型。 test_set_feature_list 具有特征记录,一旦构建模型,就可以在这些记录上进行预测。
  • 我还将预测结果附加到 final_predicton,因为数据集中每 12 条记录都会调用 process_chunk()。因此,如果我完成了final_prediction = regr.predict(test_set_feature_list)final_prediction 不会包含上次运行process_chunk() 的预测结果吗?
  • 当我打印我的final_prediction 列表时,我看到输出为[array([93495052.969556, 98555123.061462]), array([1000976814.605984, 998276347.359732]),.....]。每个array()中的两个值是什么意思?
猜你喜欢
  • 2021-04-01
  • 2018-07-31
  • 2017-01-04
  • 2016-05-10
  • 2019-05-14
  • 2017-12-25
  • 1970-01-01
  • 2016-11-14
  • 2018-05-25
相关资源
最近更新 更多