在 scikit-learn 中使用啥估算器?
Posted
技术标签:
【中文标题】在 scikit-learn 中使用啥估算器?【英文标题】:What estimator to use in scikit-learn?在 scikit-learn 中使用什么估算器? 【发布时间】:2017-03-09 08:24:40 【问题描述】:这是我第一次接触机器学习,所以我试图弄清楚这一切是如何运作的。我有一个数据集,其中我汇总了每个球员的所有统计数据,以便与我的高中棒球队一起比赛。我还有一份从我的高中进入 MLB 的所有球员的名单。我想做的是将数据分成训练集和测试集,然后将其提供给 scikit-learn 包中的某个算法,并预测获得 MLB 的概率。
因此,我查看了许多来源并找到了这张备忘单,表明我从线性 SVC 开始。
所以,据我了解,我需要将数据分解为训练样本,其中每一行是一名球员,每一列是关于球员的一段数据(打击率,基本百分比,yada,yada),X_train ;以及每个球员单行的相应真值矩阵,即 1(在 MLB 中打球)或 0(在 MLB 中没有打球),Y_train。从那里,我只做 Fit(X,Y) 然后我可以使用 predict(X_test) 来查看它是否为 Y_test 获得了正确的值。
这似乎是算法、方法和应用程序的合乎逻辑的选择吗?
编辑以提供更多信息: 数据由上场数、安打数、本垒打数、三振出局数等20个特征组成。大部分是球员职业生涯的基本统计数据;一些是击球率等比率。
我有大约 10,000 行可供使用,因此我可以据此拆分数据;但我不知道如何以最佳方式拆分数据,因为有
【问题讨论】:
提供有关您的数据的更多信息会很有帮助。它有多少功能?有多少个训练样例? 顺便问一下,您是否尝试过应用此备忘单建议的方案?如果是的话,想错了吗? 嗨@kraskevich,我已将有关数据集的更多信息编辑到问题中。我没有尝试应用该方案,部分原因是我不确定我是否正确理解了流程图(行 SVC 在分配 1 或 0 输出的概率时是否做了我认为它所做的事情)?部分原因是我想确保在深入研究详细示例之前了解 scikit-learn 工作原理的高级图景。我已经尝试阅读文档,但在理解大局方面没有取得太大进展。 我认为你需要让你的问题更具体。截至目前,它对我来说似乎过于宽泛或不清楚。我建议尝试以下方法:选择一个分类器(例如,线性回归。它是最简单的分类器之一)。阅读文档和示例,并使其适用于您的数据。选择一个合适的指标来评估它的性能(这里 f2_score 是一个不错的选择,因为很少有正面的例子)。如果您在此过程中遇到更具体的问题,请询问。 【参考方案1】:如果您在 ML 方面没有很多经验,那么在 scikit learn 中,您有分类算法(如果数据集的目标是布尔变量或分类变量)或回归算法(如果目标是连续变量) .
如果您有分类问题,并且您的变量处于非常不同的规模,那么一个很好的起点是决策树:
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
分类器是一棵树,您可以看到在节点中做出的决定。
之后你可以使用随机森林,即一组平均结果的决策树:
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
之后,您可以在每个特征中放置相同的比例:
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
您还可以使用其他算法,例如 SVM。
对于每种算法,您都需要一种技术来选择其参数,例如交叉验证:
https://en.wikipedia.org/wiki/Cross-validation_(statistics)
但好的课程是学习的最佳选择。在 coursera 中,你可以找到几门这样的好课程:
https://www.coursera.org/learn/machine-learning
【讨论】:
【参考方案2】:好的,下面是一些可能需要做的步骤:
准备您的数据集。在实践中,您可能希望扩展功能,但我们将其省略以使第一个工作模型尽可能简单。因此,只需将数据集拆分为测试/训练集。您可以手动打乱记录并将前 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
方法。
就是这样。我们有一个工作模型!当然,您可以尝试改进很多东西,例如缩放特征、尝试不同的分类器、调整它们的超参数,但这应该足以开始了。
【讨论】:
以上是关于在 scikit-learn 中使用啥估算器?的主要内容,如果未能解决你的问题,请参考以下文章
火炉炼AI机器学习019-项目案例:使用SVM回归器估算交通流量
scikit-learn 估算另一个特征中标称值组内特征的平均值
使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列