sklearn学习(3)针对科学数据处理的统计学习教程{未完}

发现网上已经有人翻译官方文献了,在这个基础上稍作修改,让翻译变得适合自己的风格。
官方原文:
http://scikit-learn.org/stable/tutorial/statistical_inference/index.html
翻译原文:
http://www.cnblogs.com/taceywong/p/4570155.html  个人根据实际情况有删改

一、统计学习:scikit-learn中的设置与评估函数对象

(1)数据集

scikit-learn 从二维数组描述的数据中学习信息。他们可以被理解成多维观测数据的列表。如(n,m),n表示样例轴,y表示特征轴。

使用scikit-learn加载一个简单的样例:iris数据集(相同的内容不截图了,上回已经截过)

>>>from sklearn import datasets 
>>>iris = datasets.load_iris()
>>>data = iris.data 
>>>data.shape
(150, 4)

它有150个iris观测数据构成,每一个样例有四个特征:萼片、花瓣长度、花瓣宽度;具体的信息可以通过iris.DESCR查看。

当数据初始时不是(n样例,n特征)样式时,需要将其预处理以被scikit-learn使用。

通过数字数据集说明数据变形
digits数据集由1797个8×8手写数字图片组成

>>>digits = datasets.load_digits()
>>>digits.images.shape
(1797, 8, 8) 
>>>import pylab as pl 
>>>pl.imshow(digits.images[-1], cmap=pl.cm.gray_r)
<matplotlib.image.AxesImage object at ...>

在scikit-learn中使用这个数据集,我们需要将其每一个8×8图片转换成长64的特征向量

python
>>>data = digits.images.reshape((digits.images.shape[0],-1))

(2)估计函数对象

拟合数据:scikit-learn实现的主要API是估计函数。估计函数是用以从数据中学习的对象。它可能是分类、回归、聚类算法,或者提取过滤数据特征的转换器。
一个估计函数带有一个fit方法,以dataset作为参数(一般是个二维数组)

>>>estimator.fit(data)

估计函数对象的参数:每一个估测器对象在实例化或者修改其相应的属性,其参数都会被设置。

>>>estimator = Estimator(param1=1, param2=2)
>>>estimator.param1
1

估测后的参数:

>>>estimator.estimated_param_

二、有监督学习:从高维观察数据预测输出变量

(1)近邻和高维灾难

iris分类
iris分类是根据花瓣、萼片长度、萼片宽度来识别三种不同类型的iris的分类任务:

>> import numpy as np
>> from sklearn import datasets
>> iris = datasets.load_iris()
>> iris_X = iris.data
>> iris_y = iris.target
>> np.unique(iris_y)
array([0, 1, 2])

最邻近分类器:
近邻也许是最简的分类器:得到一个新的观测数据X-test,从训练集的观测数据中寻找特征最相近的向量。KNN(最近邻)分类示例:

#coding=utf-8   含有中文必须规定编码格式
import numpy as np
from sklearn import datasets
def count(a1,a2,yes,no):#统计正确数与错误数
    i=0
    while i<a1.size:
        if a1[i]!=a2[i]:
            no+=1
        else :
            yes+=1
        i+=1
    return yes,no
def calRate(origin,predict):
    print "origin array:\n%s"%(origin)
    print "predict array:\n%s"%(predict)
    yes,no=0,0
    yes,no=count(origin,predict,yes,no)
    rate=float(100*yes)/float(yes+no)#正确率
    print "\nyes:%d no:%d \naccuracy rate:%f%%\n"%(yes,no,rate)


if __name__ == "__main__":
    iris=datasets.load_iris()
    iris_X=iris.data
    iris_Y=iris.target

    np.random.seed(0)
    indices=np.random.permutation(len(iris_X))
    iris_X_train=iris_X[indices[:-10]]
    iris_Y_train=iris_Y[indices[:-10]]
    iris_X_test=iris_X[indices[-10:]]
    iris_Y_test=iris_Y[indices[-10:]]

    from sklearn.neighbors import KNeighborsClassifier
    knn=KNeighborsClassifier()
    knn.fit(iris_X_train,iris_Y_train)
    predict=knn.predict(iris_X_test)
    origin=iris_Y_test
    calRate(origin,predict)


高维灾难(翻译有问题):
为了使估计器有效,需要相邻点之间的距离小于某个值d,这取决于具体问题。在一个维度上,这需要平均n〜1 / d点。在上述k-NN示例的上下文中,如果数据只有一个具有范围从0到1的值的特征,并且具有n个训练观察样本,则新数据将不会比1 / n更远。因此,一旦1 / n小于类间特征变化的规模,则最近邻居判定规则将是有效的。
如果特征数为p,则现在需要n〜1 / d ^ p个点。假设我们在一个维度上需要10个点:现在在P维度中需要10 ^ p个点来铺设[0,1]空间。随着p变大,良好估计量所需的训练点数量呈指数增长。
例如,如果每个点只是单个数字(8字节),则p-20维度中的有效k-NN估计器将需要比整个因特网的当前估计大小更多的训练数据(±1000埃比字节)。
这被称为维度灾难,是机器学习的核心问题。

(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_)
np.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2)#均方误差
print(regr.score(diabetes_X_test, diabetes_y_test))#1代表最佳预测,0表示x与y没有线性关系

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

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

发布者

VC-Robot

游戏爱好者,动漫迷,C++修炼中,编程菜鸟,随性

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据