机器学习流程及详细内容(5)

一般流程:数据收集、整理→数据预处理与特征工程(数据清理、集成、规约、变换、特征提取、筛选)→模型的选择与建立→模型的评估与优化。

定义模型:

前文详细描述了七种算法模型的实现(线性回归,逻辑回归,朴素贝叶斯,支持向量机,决策树,k近邻,神经网络)

8.随机森林

随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。

from sklearn import ensemble

# 分类
model = ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto',
max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

# 回归
model = ensemble.RandomForestRegressor(n_estimators=10, criterion='mse', max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto',
max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, verbose=0, warm_start=False)
  • criterion: 默认“mse”来选择最合适的节点。mse:均方差。mae:平均绝对误差。

  • max_features: 选择最适属性时划分的特征不能超过此值。
    当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
    if “auto”, then max_features=n_features.
    If “sqrt”, thenmax_features=sqrt(n_features).
    If “log2”, thenmax_features=log2(n_features).
    If None, then max_features=n_features.

  • max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。

  • min_samples_split: 根据属性划分节点时,每个划分最少的样本数。

  • min_samples_leaf: 叶子节点最少的样本数。

  • max_leaf_nodes: (default=None)叶子树的最大样本数。

  • min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值

  • verbose: (default=0) 是否显示任务进程

  • n_estimators=10: 决策树的个数,越多越好,但是性能就会越差,至少100左右可以达到可接受的性能和误差率。

  • bootstrap=True: 是否有放回的采样。

  • oob_score=False: oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。

  • n_jobs=1: 并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job

  • warm_start=False: 热启动,决定是否使用上次调用该类的结果然后增加新的。

  • class_weight=None: 各个label的权重。

上图是分类树效果,下图是回归树效果

  • 优点:它能够处理很高维度(feature多)的数据,并且不用做特征选择(因为特征子集是随机选择的);准确率非常高,能在大数据集上有效运行,有很好的抗噪声能力,不仅能处理离散型数据,还能处理连续型数据,而且不需要将数据集规范化。
  • 缺点:在数据噪音比较大的情况下会过拟合;随机森林中的决策树个数很多时,训练时所需要的空间和时间会会很大,这将导致模型越慢。

 9.K均值

聚类算法

from sklearn.cluster import KMeans
model = KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
  • n_clusters:整形,缺省值=8;【生成的聚类数,即产生的质心(centroids)数。】
  • max_iter:整形,缺省值=300;执行一次k-means算法所进行的最大迭代数。
  • n_init:整形,缺省值=10;用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量;此参数指定初始化方法,默认值为 ‘k-means++’。

(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
(2)‘random’ 随机从训练数据中选取初始质心。
(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

  • precompute_distances:三个可选值,‘auto’,True 或者 False;预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。

  • tol:float形,默认值= 1e-4;与inertia结合来确定收敛条件。
  • n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。

(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

  • random_state:整形或 numpy.RandomState 类型,可选;用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
  • copy_x:布尔型,默认值=True;当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

以下为实例

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn import metrics
import matplotlib.pyplot as plt

x, y = make_blobs(n_samples=1000, n_features=2, centers=4, cluster_std=[0.2, 0.3, 0.5, 0.4], shuffle=True,
                  random_state=9)
print(x[:5])
score = []

fig = plt.figure(figsize=(20, 20))
ax1 = fig.add_subplot(221)
plt.scatter(x[:, 0], x[:, 1], c=y)
plt.title('原始(设定分4类)')

ax2 = fig.add_subplot(222)
clf = KMeans(n_clusters=3, max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabasz_score(x, pred))
plt.scatter(x[:, 0], x[:, 1], c=pred)
plt.title('Kmeans分3类')

ax3 = fig.add_subplot(223)
clf = KMeans(n_clusters=4, max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabasz_score(x, pred))
plt.scatter(x[:, 0], x[:, 1], c=pred)
plt.title('Kmeans分4类')

ax4 = fig.add_subplot(224)
clf = KMeans(n_clusters=6, max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabasz_score(x, pred))
plt.scatter(x[:, 0], x[:, 1], c=pred)
plt.title('Kmeans分6类')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']  # 设置正常显示中文
plt.show()
print(score)

 

可以看出分4类时效果较好。

  • 优点:能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类;本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方;可以降低总的聚类时间复杂度。
  • 缺点:由于K为事先给定,K值的选定难以估计。很多时候并不知道给定的数据集应该分成多少个类别才最合适;数据量非常大时,算法的时间开销非常大。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值