这是我第一次接触机器学习,所以我正在尝试弄清楚这一切是如何运作的。我有一个数据集,其中我收集了所有与我高中棒球队一起比赛的每个球员的统计数据。我还有一份从我高中进入MLB的所有球员的列表。我想做的是将数据分成训练集和测试集,然后将其输入到scikit-learn包中的某个算法中,预测进入MLB的概率。
所以我查看了许多资料,并找到了一张速查表,建议我从线性SVC开始。
因此,据我所知,我需要将数据分成训练样本,每行是一个球员,每列是关于球员的一条数据(击球率、上垒率,等等),X_train;以及对应的每个球员一行的真值矩阵,简单地标记为1(在MLB打过球)或0(没有在MLB打过球),Y_train。从那里开始,我只需执行Fit(X,Y),然后我可以使用predict(X_test)来查看它是否能得到Y_test的正确值。
这种算法、方法和应用的选择是否合理?
编辑以提供更多信息:数据由20个特征组成,例如比赛场数、安打数、本垒打数、三振出局数等。大多数是关于球员职业生涯的基本计数统计;还有一些是比率,如击球率。
我总共有大约1万行数据可以使用,所以我可以根据此数据进行分割;但我不知道如何最佳地分割数据,因为只有不到1%的人进入了MLB。
回答:
好吧,以下是您可能想采取的几个步骤:
-
准备您的数据集。在实践中,您可能需要对特征进行缩放,但为了使第一个工作模型尽可能简单,我们将省略这一步。因此,只需将数据集分成测试/训练集即可。您可以手动打乱记录并取前X%的样本作为训练集,但scikit-learn库中已经有一个函数可以做到这一点:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html。您可能需要确保训练集和测试集中都有正例和负例。为了做到这一点,您可以在测试/训练分割之前将它们分开,以确保例如70%的负例和70%的正例进入训练集。
-
让我们选择一个简单的分类器。我在这里将使用逻辑回归:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html,但其他分类器的API类似。
-
创建分类器并对其进行训练非常简单:
clf = LogisticRegression()clf.fit(X_train, y_train)
-
现在是时候进行第一次预测了:
y_pred = clf.predict(X_test)
-
模型评估是一个非常重要的部分。在这里使用准确率不是一个好主意:正例的数量非常少,因此无条件返回0的模型可以获得很高的分数。我们可以改用f1分数:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html。
-
如果您想预测概率而不是标签,您可以直接使用分类器的
predict_proba
方法。
就这样。我们有了一个工作模型!当然,还有很多事情可以尝试改进,比如缩放特征,尝试不同的分类器,调整它们的超参数,但这应该足以开始了。