我的数据集的样本结构如下所示:
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()
函数中,块中的记录被处理并分为测试集
和训练集
,其中记录号10
和11
被分配到测试集
,其余的则分配到训练集
。我还将测试集
中记录的公司ID
和州
存储在一个全局列表中,以便将来显示预测值。我还将预测值追加到一个全局列表final_prediction
中。
现在我遇到的问题是,company_list
、state_list
和test_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_list
与test_set_feature_list
的长度相同,那么长度是正确的。
你可能想使用extend
,像这样:
final_prediction.extend(regr.predict(test_set_feature_list))
这也更易于阅读。
然后,final_prediction
的长度应该没问题,并且它应该是一个单一的列表,而不是列表的列表。