scikit-learn 中的设置以及预估对象

数据集

Scikit-learn可以从一个或者多个数据集中学习信息,这些数据集合可表示为2维阵列,也可认为是一个列表。列表的第一个维度代表 样本 ,第二个维度代表 特征 (每一行代表一个样本,每一列代表一种特征)。

样例: iris 数据集(鸢尾花卉数据集)

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

这个数据集包含150个样本,每个样本包含4个特征:花萼长度,花萼宽度,花瓣长度,花瓣宽度,详细数据可以通过``iris.DESCR``查看。

如果原始数据不是``(n_samples, n_features)``的形状时,使用之前需要进行预处理以供scikit-learn使用。

数据预处理样例:digits数据集(手写数字数据集)

digits数据集包含1797个手写数字的图像,每个图像为8*8像素

>>>
>>> digits = datasets.load_digits()
>>> digits.images.shape
(1797, 8, 8)
>>> import matplotlib.pyplot as plt 
>>> plt.imshow(digits.images[-1], cmap=plt.cm.gray_r) 

为了在scikit中使用这一数据集,需要将每一张8×8的图像转换成长度为64的特征向量

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

预估对象

拟合数据: scikit-learn实现最重要的一个API是`estimator`。estimators是基于数据进行学习的任何对象,它可以是一个分类器,回归或者是一个聚类算法,或者是从原始数据中提取/过滤有用特征的变换器。

所有的拟合模型对象拥有一个名为``fit``的方法,参数是一个数据集(通常是一个2维列表):

>>>
>>> estimator.fit(data)

拟合模型对象构造参数: 在创建一个拟合模型时,可以设置相关参数,在创建之后也可以修改对应的参数:

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

拟合参数: 当拟合模型完成对数据的拟合之后,可以从拟合模型中获取拟合的参数结果,所有拟合完成的参数均以下划线(_)作为结尾:


>>>

>>> estimator.estimated_param_ 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18/3/26 上午11:01
# @Author  : cicada@hole
# @File    : RecognizingDigits.py
# @Desc    : 识别手写数字 用svm
# @Link    :


# 识别手写数字
def recognizingDigits():

    import matplotlib.pyplot as plt
    from sklearn import datasets, svm, metrics

    #加载数据集
    digits = datasets.load_digits()
    images_and_labels = list(zip(digits.images, digits.target))
    # zip把两个列表打包成元祖列表 a = [1,2,3]b = [4,5,6] zip(a,b) [(1, 4), (2, 5), (3, 6)]
    # enumerate用于将对象(列表.数组.元组)组装成索引对象
    for index, (image, label) in enumerate(images_and_labels[:4]):
        plt.subplot(2, 4, index+1) # 第index+1个子图
        plt.axis('off') # 关闭所有坐标轴线 刻度和标签
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('Training: %i' % label)

    n_samples = len(digits.images)
    # print(n_samples)
    data = digits.images.reshape((n_samples, -1))

    # 创建svm分类器
    classifier = svm.SVC(gamma=0.001)
    classifier.fit(data[:n_samples //2], digits.target[:n_samples //2]) # 10//2=5 10/2=5.0

    #预测后一半的值
    expected = digits.target[n_samples // 2 :]
    predicted = classifier.predict(data[n_samples // 2:])

    # metrics.classification_report 返回每个类标签的精确\召回率及F1值

    #精度(precision) = 正确预测的个数(TP)/被预测正确的个数(TP+FP)

    #召回率(recall)=正确预测的个数(TP)/预测个数(TP+FN)

    #F1 = 2*精度*召回率/(精度+召回率)

    print("Classification report for classifier %s:\n%s:\n"
          %(classifier, metrics.classification_report(expected, predicted)))
    print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted))


    images_and_predictions = list(zip(digits.images[n_samples //2:],predicted))
    for index, (image, prediction) in enumerate(images_and_predictions[:4]):
        plt.subplot(2, 4, index+5)  # index+5应该是放在第几个子图显示
        plt.axis('off')
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('Prediction: %i' % prediction)

    plt.show()

'''
模块持久化
'''
def ci():
    from sklearn import svm
    from sklearn import datasets
    clf = svm.SVC()
    iris = datasets.load_iris()
    X, y = iris.data, iris.target
    print(clf.fit(X, y))

    import pickle
    s = pickle.dumps(clf)
    clf2 = pickle.loads(s)
    print(clf2.predict(X[0:1]))
    print(y[0])

    # 使用 joblib 替换 pickle 对大数据更有效
    from sklearn.externals import joblib
    joblib.dump(clf, 'filename.pkl') #序列化到磁盘
    clf = joblib.load('filename.pkl') # 加载已经保存的模型

'''
规定 :转换目标类型
'''
def conv():

    # 回归目标,输入被转换为float64
    import numpy as np
    from sklearn import random_projection

    rng = np.random.RandomState(0)
    X = rng.rand(10, 2000)
    X = np.array(X, dtype='float32')
    print(X.dtype)

    trans = random_projection.GaussianRandomProjection()
    X_new = trans.fit_transform(X)
    print(X_new.dtype)

    # 分类目标不变
    from sklearn import datasets
    from sklearn.svm import SVC
    iris = datasets.load_iris()
    clf = SVC()
    f = clf.fit(iris.data,iris.target)
    print(f)
    l = list(clf.predict(iris.data[:3]))
    print(l)

'''
机器学习: scikit-learn 中的设置以及预估对象
'''
def setAndPred():
    # ---- 鸢尾花数据集
    from sklearn import  datasets
    iris = datasets.load_iris()
    data = iris.data
    print(data.shape) #这个数据集包含150个样本,每个样本包含4个特征:花萼长度,花萼宽度,花瓣长度,花瓣宽度


    # ---- 数据集预处理 (手写数字)
    # digits数据集包含1797个手写数字的图像,每个图像为8*8像素
    digits = datasets.load_digits()
    print(digits.images.shape)

    import matplotlib.pyplot as plt
    plt.imshow(digits.images[-1],cmap=plt.cm.gray_r) #设置为灰度图像
    # plt.show()

    # 将8x8图像转换为长度为64的特征向量
    print((digits.images.shape[0],-1)) #-1表示不知道有多少列
    data = digits.images.reshape((digits.images.shape[0], -1))
    print(data.shape) # (1797, 64)

    #----预估对象
    # estimators是基于数据进行学习的任何对象,它可以是一个分类器,回归或者是一个聚类算法
    # estimator.fit(data)
    # estimator = Estimator(param1=1, param2=2)


if __name__ == '__main__':
    setAndPred()





你可能感兴趣的:(机器学习)