执行 scikit-learn 线性回归模型的问题
issue in executing scikit-learn linear regression model
我有一个样本结构如下所示的数据集:
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 set
和 training set
,记录编号为 10
和 11
进入 test set
而休息进入 training set
。我还将 test set
中的 company_id
和 state
记录存储到全局列表中,以供将来显示预测值。我还将预测值附加到全局列表 final_prediction
现在我面临的问题是 company_list
、state_list
和 test_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)
为什么会出现这种大小差异,我在我的代码中犯了什么错误,我可以纠正(也许我做的事情很天真,可以用更好的方式来完成)?
这里:
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
returns 是一个数组)。
因此您将向 final_prediction
追加数组,这可能会打乱您的计数:len(final_prediction)
可能等于块的数量。
此时,如果prediction_list
和test_set_feature_list
的长度相同,那么长度就OK了。
您可能想像这样使用 extend
:
final_prediction.extend(regr.predict(test_set_feature_list))
这也更容易阅读。
那么final_prediction
的长度应该没问题,应该是单个列表,而不是列表的列表。
我有一个样本结构如下所示的数据集:
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 set
和 training set
,记录编号为 10
和 11
进入 test set
而休息进入 training set
。我还将 test set
中的 company_id
和 state
记录存储到全局列表中,以供将来显示预测值。我还将预测值附加到全局列表 final_prediction
现在我面临的问题是 company_list
、state_list
和 test_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)
为什么会出现这种大小差异,我在我的代码中犯了什么错误,我可以纠正(也许我做的事情很天真,可以用更好的方式来完成)?
这里:
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
returns 是一个数组)。
因此您将向 final_prediction
追加数组,这可能会打乱您的计数:len(final_prediction)
可能等于块的数量。
此时,如果prediction_list
和test_set_feature_list
的长度相同,那么长度就OK了。
您可能想像这样使用 extend
:
final_prediction.extend(regr.predict(test_set_feature_list))
这也更容易阅读。
那么final_prediction
的长度应该没问题,应该是单个列表,而不是列表的列表。