我有一个作业,需要使用scikit、numpy和pylab来完成以下任务:
“所有以下操作都应使用提供的training_data.csv文件中的数据。training_data为您提供了一组标记的整数对,表示两个运动队的得分,标签给出了运动类型。
编写以下函数:
plot_scores() 应绘制数据的散点图。
predict(dataset) 应生成一个训练好的估计器,用于猜测给定得分所对应的运动(来自我们保留的数据集,将作为1000 x 2的np数组输入)。您可以使用scikit中的任何算法。
一个可选的附加函数名为“preprocess”,将在数据集传递给predict之前对其进行处理。”
这是我目前所做的:
import numpy as npimport scipy as spimport pylab as plfrom random import shuffledef plot_scores(): k=open('training_data.csv') lst=[] for triple in k: temp=triple.split(',') lst.append([int(temp[0]), int(temp[1]), int(temp[2][:1])]) array=np.array(lst) pl.scatter(array[:,0], array[:,1]) pl.show()def preprocess(dataset): k=open('training_data.csv') lst=[] for triple in k: temp=triple.split(',') lst.append([int(temp[0]), int(temp[1]), int(temp[2][:1])]) shuffle(lst) return lst
在preprocess中,我对数据进行了洗牌,因为我需要用其中的一部分进行训练,另一部分进行测试,但原始数据完全不随机。我的问题是,如何在predict(dataset)中“生成训练好的估计器”?这是否应该是一个返回另一个函数的函数?对于看起来像这样的数据集,哪种算法最适合进行分类:
回答:
任务可能希望您训练一个标准的scikit分类器模型并返回它,即类似于
from sklearn.svm import SVCdef predict(dataset): X = ... # 特征,从数据集中提取 y = ... # 标签,从数据集中提取 clf = SVC() # 创建分类器 clf.fit(X, y) # 训练 return clf
不过,从函数名称(predict
)来看,您应该检查它是否真的希望您返回一个训练好的分类器,还是返回给定dataset
参数的预测结果,因为后者更为常见。
作为分类器,您基本上可以使用任何您喜欢的。您的图表看起来数据集是线性可分的(没有为类别着色,但我假设那些团块是两个类别)。对于线性可分的数据,几乎没有什么会失败。尝试使用SVM、逻辑回归、随机森林、朴素贝叶斯等。为了增加乐趣,您可以尝试绘制决策边界,参见这里(其中还包含了可用分类器的概览)。