diff --git "a/docs/7.\351\233\206\346\210\220\345\255\246\344\271\240\344\270\216\351\232\217\346\234\272\346\243\256\346\236\227.md" "b/docs/7.\351\233\206\346\210\220\345\255\246\344\271\240\344\270\216\351\232\217\346\234\272\346\243\256\346\236\227.md" index f46b21fc83e67126c60f3b5e4caf85ff3b9fd227..a7cb12430f85333024e9ee0d190f3ed03836b6b3 100644 --- "a/docs/7.\351\233\206\346\210\220\345\255\246\344\271\240\344\270\216\351\232\217\346\234\272\346\243\256\346\236\227.md" +++ "b/docs/7.\351\233\206\346\210\220\345\255\246\344\271\240\344\270\216\351\232\217\346\234\272\346\243\256\346\236\227.md" @@ -4,7 +4,7 @@ 例如,你可以训练一组决策树分类器,每一个都在一个随机的训练集上。为了去做预测,你必须得到所有单一树的预测值,然后通过投票(例如第六章的练习)来预测类别。例如一种决策树的集成就叫做随机森林,它除了简单之外也是现今存在的最强大的机器学习算法之一。 -向我们在第二章讨论的一样,我们会在一个项目快结束的时候使用集成算法,一旦你建立了一些好的分类器,就把他们合并为一个更好的分类器。事实上,在机器学习竞赛中获得胜利的接活经常会包含一些集成方法。 +向我们在第二章讨论的一样,我们会在一个项目快结束的时候使用集成算法,一旦你建立了一些好的分类器,就把他们合并为一个更好的分类器。事实上,在机器学习竞赛中获得胜利的算法经常会包含一些集成方法。 在本章中我们会讨论一下特别著名的集成方法,包括 *bagging, boosting, stacking* ,和其他一些算法。我们也会讨论随机森林。 @@ -20,28 +20,62 @@ 令人惊奇的是这种投票分类器得出的结果经常会比集成中最好的一个分类器结果更好。事实上,即使每一个分类器都是一个弱学习器(意味着它们也就比瞎猜好点),集成后仍然是一个强学习器(高准确率),只要有足够数量的弱学习者,他们就足够多样化。 +这怎么可能?接下来的分析将帮助你解决这个疑问。假设你有一个有偏差的硬币,他有51%的几率正面朝上,49%的几率背面朝上。如果你实验1000次,你会得到差不多510次正面朝上,490次背面朝上,因此大多数人都是正面的。如果你用数学计算,你会发现在实验1000次后得到满足正面朝上的概率51%的人比例为是75%。你实验的次数越多,正面朝上的几率越大(例如你试验了10000次,人群比例可能性就会达到97%)。这是因为 *大数定律* :当你一直用硬币实验时,正面朝上的比率会越来越接近51%。图7-3展示了始终有偏差的硬币实验。你可以看到当实验次数上升时,正面朝上的概率接近于51%。最终所有10种实验都会收敛到51%,它们都大于50%。 +![图7-3](https://github.com/apachecn/hands_on_Ml_with_Sklearn_and_TF/blob/Lisanaaa/images/chapter_3/chapter3.2.jpeg)(未改) +同样的,假设你创建了一个包含1000个分类器的集成模型,其中每个分类器的正确率只有51%(仅比瞎猜好一点点)。如果你用投票去预测类别,你可能得到75%的准确率!然而,这仅仅在所有的分类器都独立运行的很好、不会发生有相关性的错误的情况下才会这样,然而每一个分类器都在同一个数据集上训练,导致其很可能会发生这样的错误。他们可能会犯同一种错误,所以也会有很多票投给了错误类别导致集成的准确率下降。 +如果使每一个分类器都独立自主的分类,那么集成模型会工作的很好。去得到多样的分类器的方法之一就是用完全不同的算法,这会使它们会做出不同种类的错误,这会提高集成的正确率 +接下来的代码创建和训练了在sklearn中的投票分类器。这个分类器由三个不同的分类器组成(训练集是第五章中的moons数据集): +```python +>>> from sklearn.ensemble import RandomForestClassifier +>>> from sklearn.ensemble import VotingClassifier +>>> from sklearn.linear_model import LogisticRegression +>>> from sklearn.svm import SVC +>>> log_clf = LogisticRegression() +>>> rnd_clf = RandomForestClassifier() +>>> svm_clf = SVC() +>>> voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf), >>> ('svc', svm_clf)],voting='hard') +>>> voting_clf.fit(X_train, y_train) +``` +让我们看一下在测试集上的准确率: ```python ->>> from sklearn.datasets import fetch_mldata ->>> mnist = fetch_mldata('MNIST original') ->>> mnist -{'COL_NAMES': ['label', 'data'], -'DESCR': 'mldata.org dataset: mnist-original', -'data': array([[0, 0, 0, ..., 0, 0, 0], - [0, 0, 0, ..., 0, 0, 0], - [0, 0, 0, ..., 0, 0, 0], - ..., - [0, 0, 0, ..., 0, 0, 0], - [0, 0, 0, ..., 0, 0, 0], - [0, 0, 0, ..., 0, 0, 0]], dtype=uint8), -'target': array([ 0., 0., 0., ..., 9., 9., 9.])} +>>> from sklearn.metrics import accuracy_score +>>> for clf in (log_clf, rnd_clf, svm_clf, voting_clf): +>>> clf.fit(X_train, y_train) +>>> y_pred = clf.predict(X_test) +>>> print(clf.__class__.__name__, accuracy_score(y_test, y_pred)) +LogisticRegression 0.864 +RandomForestClassifier 0.872 +SVC 0.888 +VotingClassifier 0.896 ``` +你看!投票分类器比其他单独的分类器表现的都要好。 + +如果所有的分类器都能够预测类别的概率(例如他们有一个 *predict_proba()* 方法),那么你就可以让sklearn以最高的类概率来预测这个类,平均在所有的分类器上。这种方式叫做软投票。他经常比硬投票表现的更好,因为它给予高自信的投票更大的权重。你可以通过把 *voting="hard"* 设置为 *voting="soft"* 来保证分类器可以预测类别概率。然而这不是SVC类的分类器默认的选项,所以你需要把它的 *probability hyperparameter* 设置为 *True* (这会使SVC使用交叉验证去预测类别概率,其降低了训练速度,但会添加 *predict_proba()* 方法)。如果你修改了之前的代码去使用软投票,你会发现投票分类器正确率高达91% + +## Bagging 和 Pasting + + + + + + + + + + + + + + + + 一般而言,由 sklearn 加载的数据集有着相似的字典结构,这包括: - `DESCR`键描述数据集