在数据挖掘的过程中,咱们经常会遇到一些问题,比方:怎么挑选各种分类器,到底挑选哪个分类算法,是SVM、决议计划树、仍是KNN?怎么优化分类器的参数,以便得到更好的分类准确率?

随机森林分类器

随机森林的英文是 Random Forest,英文简写是 RF。它是一个包含多个决议计划树的分类器,每一个子分类器都是一棵 CART 分类回归树。所以随机森林既能够做分类,又能够做回归。

  • 当它做分类的时分,输出成果是每个子分类器的分类成果中最多的那个。能够了解是每个分类器都做投票,取投票最多的那个成果。
  • 当它做回归的时分,输出成果是每棵 CART 树的回归成果的平均值。

在 sklearn 中,咱们运用 RandomForestClassifier() 结构随机森林模型,函数里有一些常用的结构参数:

  • n_estimators: 随机森林里决议计划树的个数,默许是10
  • criterion:决议计划树割裂的标准,默许是基尼指数(CART算法),也能够挑选entropy(ID3算法)
  • max_depth: 决议计划树的最大深度,默许是None, 不限制
  • n_jobs:拟合和猜测的时分CPU的核数,默许是1

GridSearchCV 对模型参数进行调优

分类算法,咱们经常需求调理网络参数(对应上面的结构参数),目的是得到更好的分类成果。实践上一个分类算法有许多参数,取值规模也比较广,那么该怎么调优呢?

Python 给咱们提供了一个很好用的东西 GridSearchCV,它是Python的参数主动查找模块,能够主动决议计划最优参数。

咱们运用 GridSearchCV(estimator, param_grid, cv=None, scoring=None) 结构参数的主动查找模块,这里有一些首要的参数需求说明:

  • estimator:代表选用的分类器,如随机森林、决议计划树、SVM、KNN等
  • param_grid: 代表想要优化的参数及取值
  • cv: 穿插验证的折数,默许是None, 代表运用三折穿插验证
  • scoring:准确度的点评标准,默许是None, 也便是需求运用score函数

举例,咱们运用sklearn自带的IRIS数据集,选用随机森林对IRIS数据分类。如果咱们想知道n_estimators在1-10的规模内取哪个值的分类成果最好,能够编写代码如下:

# -*- coding: utf-8 -*-
# 运用RandomForest对IRIS数据集进行分类
# 运用GridSearchCV寻找最优参数
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
rf = RandomForestClassifier()
parameters = {"n_estimators": range(1, 11)}
iris = load_iris()
# 运用GridSearchCV进行参数调优
clf = GridSearchCV(estimator=rf, param_grid=parameters)
# 对iris数据集进行分类
clf.fit(iris.data, iris.target)
print("最优分数: %.4lf" % clf.best_score_)
print("最优参数:", clf.best_params_)

运转成果:

最优分数: 0.9600
最优参数: {'n_estimators': 3}

运用 Pipeline 进行流水线作业

在进行数据分类的时分往往都是有多个过程的,比方先对数据进行标准化处理,也能够用PCA对数据降维,最终再运用分类器进行分类。

Python有一种Pipeline管道机制。管道机制便是让咱们把每一步都按顺序列下来,然后创立Pipeline流水线作业。每一步都选用(‘名称’,过程)的方式来表明。

那么咱们现在选用Pipeline管道机制,用随机森林对IRIS数据集做一下分类。先用StandardScaler办法对数据标准化,即选用数据标准化为均值为0,方差为1的正态分布,然后选用PCA办法对数据进行降维,最终选用随机森林进行分类,编写代码如下:

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
rf = RandomForestClassifier()
parameters = {"randomforestclassifier__n_estimators": range(1, 11)}
iris = load_iris()
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('pca', PCA()),
    ('randomforestclassifier', rf)
])
clf = GridSearchCV(estimator=pipeline, param_grid=parameters)
clf.fit(iris.data, iris.target)
print("最优分数: %.4lf" % clf.best_score_)
print("最优参数:", clf.best_params_)

运转成果如下:

最优分数: 0.9600
最优参数: {'randomforestclassifier__n_estimators': 9}