数据集
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)
<matplotlib.image.AxesImage object at ...>
为了在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()