在执行scikit-learn线性回归模型时遇到问题

我的数据集的样本结构如下所示:

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

记录的顺序是公司ID,州,利润,特征1,特征2,特征3

现在我编写了这段代码,它将整个数据集分成每12条记录的块(每家公司和每个州的公司都有12条记录),然后传递给process_chunk()函数。在process_chunk()函数中,块中的记录被处理并分为测试集训练集,其中记录号1011被分配到测试集,其余的则分配到训练集。我还将测试集中记录的公司ID存储在一个全局列表中,以便将来显示预测值。我还将预测值追加到一个全局列表final_prediction中。

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

from sklearn import linear_modelimport numpy as npimport csvfinal_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 = []    # 将第10和11行放入测试集以进行划分    count = 0    for line in chuk:        # 将字符串转换为numpy数组        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    # 创建线性回归对象    regr = linear_model.LinearRegression()    # 使用训练集训练模型    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)# 加载并解析数据file_read = open('data.csv', 'r')reader = csv.reader(file_read)chunk, chunksize = [], 12for i, line in enumerate(reader):    if (i % chunksize == 0 and i > 0):        process_chunk(chunk)        del chunk[:]    chunk.append(line)# 处理剩余部分#process_chunk(chunk)print len(company_list)print len(test_set_feature_list)print len(final_prediction)

为什么会出现这种大小差异?我在代码中犯了什么错误可以纠正(可能是我做得非常简单粗暴,可以有更好的方法)?


回答:

在这里:

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_listtest_set_feature_list的长度相同,那么长度是正确的。

你可能想使用extend,像这样:

final_prediction.extend(regr.predict(test_set_feature_list))

这也更易于阅读。

然后,final_prediction的长度应该没问题,并且它应该是一个单一的列表,而不是列表的列表。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注