加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数据处理的统计学习(scikit-learn教程)

发布时间:2020-12-26 01:40:33 所属栏目:大数据 来源:网络整理
导读:数据挖掘入门与实战 ?公众号: datadw Scikit-learn 是一个紧密结合Python科学计算库(Numpy、Scipy、matplotlib),集成经典机器学习算法的Python模块。 一、统计学习:scikit-learn中的设置与评估函数对象 (1)数据集 scikit-learn 从二维数组描述的数据中

高维灾难:
对于一个有效的学习算法,你需要最近n个点之间的距离d(依赖于具体的问题)。在一维空间中,需要平局n1/d各点,在上文中提到的K-NN例子中,如果数据只是有一个0-1之间的特征和n个训练观测数据所表述的画,那么新数据将不会超过1/n。因此,最近邻决策规则非常高效,因为与类间特征变化的范围相比,1/n小的多。

如果特征数是P,你就需要n 1/d^p个点。也就是说,如果我们在一维度情况下需要10个点,在P维度情况下需要10^p个点。当P变大的时候,为获得一个好的预测函数需要的点数将急剧增长。

这被称为高维灾难(指数级增长),也是机器学习领域的一个核心问题。

(2)线性模型:从回归到稀疏性

Diabets数据集(糖尿病数据集)
糖尿病数据集包含442个患者的10个生理特征(年龄,性别、体重、血压)和一年以后疾病级数指标。

diabetes = datasets.load_diabetes()
diabetes_X_train = diabetes.data[:-20]
diabetes_X_test = diabetes.data[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
手上的任务是从生理特征预测疾病级数
线性回归:
【线性回归】的最简单形式给数据集拟合一个线性模型,主要是通过调整一系列的参以使得模型的残差平方和尽量小。

线性模型:y = βX+b ? ?X:数据
 ? ?y:目标变量
 ? ?β:回归系数 ? ?b:观测噪声(bias,偏差)
from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train,diabetes_y_train)print(regr.coef_)
# The mean square errornp.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2)# Explained variance score: 1 is perfect prediction# and 0 means that there is no linear relationship# between X and Y.regr.score(diabetes_X_test,diabetes_y_test)

收缩(Shrinkage):
如果每一维的数据点很少,噪声将会造成很大的偏差影响:

X = np.c_[ .5,1].T
y = [.5,1]
test = np.c_[ 0,2].T
regr = linear_model.LinearRegression()import pylab as pl 
pl.figure() 
np.random.seed(0)for _ in range(6): 
 ? this_X = .1*np.random.normal(size=(2,1)) + X
 ? regr.fit(this_X,y)
 ? pl.plot(test,regr.predict(test)) 
 ? pl.scatter(this_X,y,s=3) ?

高维统计学习的一个解决方案是将回归系数缩小到0:观测数据中随机选择的两个数据集近似不相关。这被称为岭回归(Ridge Regression):

regr = linear_model.Ridge(alpha=.1)
pl.figure() 
np.random.seed(0)for _ in range(6): 
 ? this_X = .1*np.random.normal(size=(2,s=3)

这是一个偏差/方差(bias/variance)的权衡:岭α参数越大,偏差(bias)越大,方差(variance)越小

我们可以选择α以最小化排除错误,这里使用糖尿病数据集而不是人为制造的数据:

alphas = np.logspace(-4,-1,6)from __future__ import print_functionprint([regr.set_params(alpha=alpha
 ? ? ? ? ? ?).fit(diabetes_X_train,diabetes_y_train,? ? ? ? ? ?).score(diabetes_X_test,diabetes_y_test) for alpha in alphas])

【注意】扑捉拟合参数的噪声使得模型不能推广到新的数据被称为过拟合。岭回归造成的偏差被称为正则化(归整化,regularization)

稀疏性:
只拟合特征1和特征2:

【注意】整个糖尿病数据包含11维数据(10个特征维,一个目标变量),很难对这样的数据直观地表现出来,但是记住那是一个很空的空间也许是有用的。

我们可以看到,尽管特征2在整个模型中占据很大的系数,但是和特征1相比,对结果y造成的影响很小。

为了提升问题的状况(考虑到高维灾难),只选择信息含量较大的(对结果y造成的影响较大的)的特征,不选择信息含量较小的特征会很有趣,如把特征2的系数调到0.岭回归将会减少信息含量较小的系数的值,而不是把它们设置为0.另一种抑制措施——Lasso(最小绝对收缩和选择算子)可以使得一些参数为0.这些方法被称作稀疏方法。系数操作可以看作是奥卡姆的剃刀:模型越简单越好。

regr = linear_model.Lasso()
scores = [regr.set_params(alpha=alpha
 ? ? ? ? ? ?).fit(diabetes_X_train,diabetes_y_train
 ? ? ? ? ? ?).score(diabetes_X_test,diabetes_y_test) ? ? ? 
for alpha in alphas] best_alpha = alphas[scores.index(max(scores))] regr.alpha = best_alpha regr.fit(diabetes_X_train,diabetes_y_train)print(regr.coef_)

针对相同问题的不同算法:
不同的算法可以被用来解决相同的数学问题。例如scikit-learn中的Lasso对象使用coordinate decent方法解决lasso回归问题,在大数据集上是很有效的。然而,scikit-learn也使用LARS算法提供了LassoLars对象,对于处理权重向量非常稀疏的数据非常有效(数据的观测实例非常少)。

  • 分类:
    对于分类问题,比如iris标定任务,线性回归不是正确的方法。因为它会给数据得出大量远离决策边界的权重。一个线性方法是你和一个sigmoid函数或者logistic函数:

logistic = linear_model.LogisticRegression(C=1e5)
logistic.fit(iris_X_train,iris_y_train)

这就是有名的logistic回归。

  • 多分类:
    如果你有多个类别需要预测,一个可行的方法是 “一对多”分类,接着根据投票决定最终的决策。

通过Logistic回归进行收缩和稀疏:

在LogisticRegression对象中C参数控制着正则化的数量:C越大,正则化数目越少。penalty= "12" 提供收缩(非稀疏化系数),penalty="11"提供稀疏化。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读