Sklearn_工具--2SKlearn介绍

一.Python科学计算环境Final

在这里插入图片描述

Scikit-Image是专门用来处理图像的机器学习接口
处理图像的还有OpenCV,OpenCV使用c和c++写的,但是提供了python接口,可以用python去调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二.SKlearn算法库的顶层设计

科学包是如何架构起来的

1.SKlearn包含哪些模块

SKlearn监督学习模块有15种
在这里插入图片描述
SKlearn无监督学习模块
在这里插入图片描述
SKlearn数据变换模块
在这里插入图片描述

管道流pipline严格来说不是数据变换模块,pipline负责输出重定向,sklearn通过pipline可以将train,test,得分估计连成一个一长串的,方便整理代码。

在这里插入图片描述

baseEstimator,基础估计器。sklearn把所有的分类器,聚类器都叫做Estimator。、
ClassifierMixin,所有分类器的顶级父类,有一个抽象函数score。所有继承了ClassifierMixin的子类都要继承score方法。专门让获得_estimator_type_的函数,_estimator_type_="classifier"表明,所有继承了ClassifierMixin的子类都是_estimator_type_="classifier"类。
RegressorMixin,所有回归算法的顶级父类,所有回归算法都要继承RegressorMixin。

举例说明,以SVM为例

ABCMeta是外部的,不属于SKlearn,因而这里用external来标注。

SVM涉及到了baseEstimator,ClassifierMixin分类器的顶级父类,RegressorrMixin回归器的顶级父类。
SVM这个sklearn下的子包,svm里面有好多算法,
svm既可以进行分类,也可以回归
分类子类必然继承ClassifierMixin父类,回归子类必然继承RegressorrMixin父类,有的特殊算法比如SVM既可分类又可回归,就两者都继承。
BaseSVC()子类继承了三个父类。

在这里插入图片描述
举例说明,以cluster为例
在这里插入图片描述
举例说明,以feature_extraction为例
在这里插入图片描述

2.SKlearn六大板块统一API

2.1API

打了方括号[]的是可有可无的参数,在分类和回归中是必须有的,但是在聚类和维数约简中,数据预处理中可以不用传。

在这里插入图片描述

2.2sklearn监督学习工作流程

  1. 工作流程
    在这里插入图片描述
  2. 举例说明
    在pycharm中运行jupyter notebook写的文件

点击run
在这里插入图片描述
The Jupyter Notebook is running at: ,Kernel started:启动了
在这里插入图片描述
运行每个部分
点中那个部分,然后run,和在jupyter notebook中一样
代码
在这里插入图片描述
在这里插入图片描述

np.bincount(),统计np.array中有几个数据类别,每个类别分别所占比例。

在这里插入图片描述
在这里插入图片描述

print(classifier),可打印出函数信息

在这里插入图片描述
这样就训练好了
然后开始做预测
在这里插入图片描述
预测完之后,预测正确率
在这里插入图片描述
在这里插入图片描述

np.sum(pred_y == test_y)/float(len(test_y)),判断预测值pred_y和真实值test_y是否相等,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2sklearn无监督学习工作流程

在这里插入图片描述
在这里插入图片描述

2.3sklearn数据预处理工作流程

在这里插入图片描述

标准化之后,数据范围在(-1.4,1.4)之间
归一化之后,数据范围在(-1,1)之间

举例说明标准化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
举例说明维数约简
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4SKlearn算法模块的学习顺序

在这里插入图片描述
在这里插入图片描述

三.SKlearn数据集操作API

在这里插入图片描述

自带的小数据集是安装SKlern时候就自动给下载好的

1.自带小数据集

在这里插入图片描述

class Bunch(dict),这些数据集返回的都是dict类型的Bunch对象,继承了字典,所以这些数据都有键值对

1.1鸢尾花数据集

在这里插入图片描述

这个数据集是在UCI数据库中,UCI数据库是机器学习数据库

操作实例
在这里插入图片描述

keys有:target-目标值,鸢尾花种类的标签。data-鸢尾花的四个特征,样本特征向量矩阵。target_names-类别标签(数字)代表什么花。DESCR-对整个数据集的描述。feature_names-描述data中每一列是什么样的特征属性。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

iris.data.shape,打印出来是一个元组,元组中包含两个值行(样本数量)和列(特征数量),也可以将其分别赋值给n_samples,n_features。
iris.data[0:2],默认表示对data数据集按行取值,即按照样本索引取值。
iris.target,目标数据集。

在pycharm中可以方便地看到函数的源代码,摁住ctrl键,再鼠标单击函数名称,就可以到达函数源代码中,以load_iris为例,关于这个数据集的描述都有
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面调用load_iris(return X,y=False),默认return X,y=False,则调用该数据集返回Bunch(dict)对象。如果return X,y=True,则只返回data,target数据。

在这里插入图片描述

np.bincount(),统计np.array中的不同数据类型出现的次数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

zip()函数可以将iris.target_names对应的列表中包含的三个字符串和colors对应的列表的三个字符串拼成一个元组形式,且其中两者一一对应,共3组。取出来后第一个是label,第二个是color。

更改x_index=0,1,2,3.可以画出不同特征的图,而单一特征难以区分出不同的花,
第2个和第3个特征在3种花之间有较好区分。

通过图示,可以看到这些样本在每一个特征分量上的分布情况,这样对数据集有了一个整体的把握。
这是探索性的数据分析,在设计机器学习算法的前期是非常重要的。探索性分析是大数据分析中一个非常重要的步骤。也就是说,一开始我完全不知道数据会呈现出什么样的状态,但是将每个特征都打印出频率分布值,图示出来会带给我一些数据分析的灵感。

二维画图
在这里插入图片描述

直方图只有一个变量就可以,直方图本身就是一维的。但是散点图是二维的,必须有两个特征才能看到。

第一个二维图中,setosa明显和其他两个区分开了。其他两个花交织在一起。
可以将不同特征组合起来去画图,通过变换特征组合,可以观察数据集在不同特征维度下的分布。
如果数据量很大,那么可以对数据随机采样,缩小数据,然后观察数据分布。做了探索性分析之后再去设计我的分类器。
比如在这里,探索性分析表明两个特征就可以将不同类别分开,如果我设计了一个非常复杂的神经网络那就完全没有必要。

代码如下

from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()
n_samples,n_features=iris.data.shape
print(n_samples)
print(n_features)
print(iris.data)
print(iris.data.shape)
print(iris.target.shape)
print(iris.target)

import numpy as np
print(iris.target_names)
np.bincount(iris.target)

import matplotlib.pyplot as plt
# 查看第一个特征
x_index=3
colors=['blue','red','green']
for label,color in zip(range(len(iris.target_names)),colors):
    plt.hist(iris.data[iris.target==label,x_index],label=iris.target_names[label],color=color)
# 此处,label的值在0,1,2中依次循环,因而循环体中的函数是按照循环挨个执行。涉及到循环时,无论循环体中是什么内容,都
# 不要将循环的结果作为整体看,而应将循环的结果依次看,循环第一次,第二次,...。这样循环结束,循环的每一个结果就都运行了。
# 区分一下,之所以仅按照样本循环,而不将特征也循环,是因为每次画图仅能画一张,而不能讲所有特征都画到一张图上。
plt.xlabel(iris.feature_names[x_index])
plt.legend(loc='upper right')
plt.show()

# 对上面代码的细分解释
colors=['blue','red','green']
for label,color in zip(range(len(iris.target_names)),colors):
    print(label,color)
iris.target==label
# 显示如下的原因:label是上面for label,color in zip(range(len(iris.target_names)),colors):中循环所得,循环时会
# 依次循环出0,1,2.但是如果直接打印label,不按照循环依次打印,则只打印循环的最后一个数据。而在循环中,会依次打印
# 出所有项,也就是0,1,2.
iris.data[iris.target==label]
iris.data[iris.target==label,x_index].shape

# 二维画图
x_index=0
y_index=2
colors=['blue','red','green']
for label,color in zip(range(len(iris.target_names)),colors):   plt.scatter(iris.data[iris.target==label,x_index],iris.data[iris.target==label,y_index],label=iris.target_names[label],color=color)
plt.xlabel(iris.feature_names[x_index])
plt.ylabel(iris.feature_names[y_index])
plt.legend(loc='upper right')
plt.show()

1.2手写数字数据集:load_digits()

在这里插入图片描述

from sklearn.datasets import load_digits
digits=load_digits()
digits.keys() # 这个数据集是图像数据集,所有有images

在这里插入图片描述

n_samples,n_features=digits.data.shape 
print(n_samples,n_features) 

在这里插入图片描述

print(digits.data.shape)#1797个样本,64个特征,即64维数据
print(digits.images.shape)# data里面是把8*8的图像块一行一行的展开了,image中的图像数据是没有展开的。
print(digits.target.shape)

在这里插入图片描述

import numpy as np
# 数组元素的比对,用“==”比较.用all(),比对a矩阵和b矩阵的所有对应的元素是否相等.
# any()查看两矩阵是否有一个对应元素相等
# all()是对两个矩阵的比对结果做一次与运算,而any()是做一次或运算
print(np.all(digits.images.reshape(1797,64)==digits.data))
# 结果为True
print(digits.images.shape)
digits.images # 结果表明,1797个数组,每个数组中又包含8个数组,每个数组中又包含8个元素

在这里插入图片描述

digits.data # 结果为,1797个数组,每个数组中包含64个元素

在这里插入图片描述

# np..reshape()在不改变数据内容的情况下,改变一个数组的格式,参数及返回值
# np..reshape(a,newshape,order='c'),a:数组--需要处理的数据,order : 可选范围为{'C','F','A'}。
# 使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数
# 的设置,默认参数为C.“C”,按行顺序,“F”,按列顺序.
digits.images.reshape(1797,64)

在这里插入图片描述

import matplotlib.pyplot as plt
# 设置画布
fig=plt.figure(figsize=(6,6)) #画布尺寸
fig.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)

# 绘制数字:每张图像8*8像素
for i in range(64):
    # add_subplot(nrows,ncols,index,**kwargs),nrows,ncols表示画出几行几列的网格,index表示
    #在网格中第几个格中画图。
    ax=fig.add_subplot(8,8,i+1,xticks=[],yticks=[])
    # digits.images.shape是(1797,8,8),这里只列出其中64个样本。
    ax.imshow(digits.images[i],cmap=plt.cm.binary,interpolation='nearest')
    # 用目标值标记图像
    # 添加文本信息,ax.text(x, y, s),x,y:表示坐标,s:字符串文本.
    ax.text(0,7,str(digits.target[i]))

plt.show()

在这里插入图片描述

1.3乳腺癌数据集:load_breast_cancer()

简单经典的用于二分类任务的数据集
在这里插入图片描述

1.4糖尿病数据集:load_diabetes()

经典的用于回归任务的数据集
在这里插入图片描述

1.4波士顿房价数据集:load_boston()

经典的用于回归任务的数据集

categorical,绝对的,无条件的,分类的。就是指:非数值型变量,分类型变量,比如男/女。对应numerical数值型,numerical/categorical

在这里插入图片描述

1.5体能训练数据集:load_linnerud()

经典的用于多变量回归任务的数据集 在这里插入图片描述

1.6图像数据集:load_sample_image(name)

加载一张指定名称的数据集,构成如下

可以看到,china.jpg是一张427*640分辨率图像,同时还是RGB彩色图像。
是numpy类型

在这里插入图片描述

2.svmlight/libsvm格式的数据集

在这里插入图片描述

上面两种加载方式,后一种加载方式可以保证X_train,X_test,两者有同样多的特征,即两者数据维数一样。

3.可在线下载的数据集(Downloadable Dataset)

sklean.datasets.fetch_<name>

在这里插入图片描述

3.1 20类新闻文本数据集

在这里插入图片描述
操作实例

# 20组新闻文本数据集API用法详解
from sklearn.datasets import get_data_home #get_data_home()返回默认路径
print(get_data_home())

from sklearn.datasets import fetch_20newsgroups
# 两个参数。
# data_home,指定文件路径。"./scikit_learn_data"表示当前运行路径下的scikit_learn_data文件夹
# '~/scikit_learn_data',是操作系统用户目录
# subset='all',加载所有数据集,'train'加载训练数据集,'test'加载测试数据集
# 这里加载了所有数据集,但是指定名称写成了newsgroups_train
newsgroups_train=fetch_20newsgroups(data_home="./scikit_learn_data",subset='all')
newsgroups_train.keys()
# 输出目标变量target的names
# print()输出结果都在一行,不方便查看,而pprint()采用分行打印输出
from pprint import pprint
pprint(list(newsgroups_train.target_names))
# 真正的数据存放在'filenames'和'target'中。'filenames'里面是新闻文本文件名,'target'里面是
# 新闻类别的标签(用正整数来表示)
print(newsgroups_train.filenames.shape)
print(newsgroups_train.target.shape)
print(newsgroups_train.target[:10]) #结果,数据集顺序打乱了。这里关系到载入数据集时,
# fetch_20newsgroups()中参数shuffle=True,shuffle洗牌。
# 也可以为'fetch_20newsgroups'函数指定加载的新闻类别,给它传入一个新闻类别名称的list变量就可以了
cats=['alt.atheism','sci.space']
newsgroups_train=fetch_20newsgroups(data_home="./scikit_learn_data",subset='train',categories=cats)
print(newsgroups_train.keys())
print(list(newsgroups_train.target_names))
print(newsgroups_train.filenames.shape)
print(newsgroups_train.target.shape)
print(newsgroups_train.target[:10])# 只有两个类,所以下面就只有0,1

#上面加载出来的data中还是文本内容,想让计算机处理就得是数字内容,所以把文本内容转换为特征向量
为了把文本内容传递到学习器学习,我们首先要把文本内容转换成计算机理解的数字向量,然后用统计机器机器学习的方法去发现其内部隐藏的规律。这个特征提取的任务可以通过'sklearn.feature_extraction.text'来实现。最后文本内容就变成了一种'TF-IDF'的一元语言模型向量
TF-IDF(term frequency-inverse document frequency)词频-逆向文件频率,将文字转化为模型可以处理的向量,字词的重要性与其在文本中出现的频率成正比(TF),与其在语料库中出现的频率成反比(IDF).
TF:词频。TF(w)=(词w在文档中出现的次数)/(文档的总词数),IDF:逆向文件频率。有些词可能在文本中频繁出现,但并不重要,也即信息量小,如is,of,that这些单词,这些单词在语料库中出现的频率也非常大,我们就可以利用这点,降低其权重。IDF(w)=log_e(语料库的总文档数)/(语料库中词w出现的文档数)
将上面的TF-IDF相乘就得到了综合参数:TF-IDF=TF*IDF
from sklearn.feature_extraction.text import TfidfVectorizer
categories=['alt.atheism','talk.religion.misc','comp.graphics','sci.space']
newsgroups_train=fetch_20newsgroups(data_home="./scikit_learn_data",subset='train',categories=categories)
vectorizer=TfidfVectorizer()
# data中是原始数据,文本内容。文本内容通过fit_transform转换成计算机可处理的数字特征向量
# 数据预处理,特征向量提取都有fit_transform()
vectors=vectorizer.fit_transform(newsgroups_train.data)
print(vectors.shape)
print(vectors)
# 抽取得到的TF-IDF向量是非常稀疏的,平均有159个特征分量,在超过30000维空间里面采样得到。
vectors.nnz/float(vectors.shape[0])
# sklearn.datasets.fetch_20newsgroups_vectorized函数可以直接返回文本的特征分量,不用再去抽取了
from sklearn.datasets import fetch_20newsgroups_vectorized 
# Load the 20 newsgroups dataset and vectorize it into token counts (classification).

3.2 野外带标记人脸数据集:fetch_lfw_people()/fetch_lfw_pairs()

在这里插入图片描述
操作示例

#用于野外人脸识别的带标记人脸数据集(the labeled face in the wild) 该数据集总共有两个API操作函数,一个是"fetch_lfw_people()"用于人脸识别任务(多类分类任务),另一个是"fetch_lfw_pairs()"用于人脸验证任务
# fetch_lfw_people()函数用法

from sklearn.datasets import fetch_lfw_people
lfw_people=fetch_lfw_people(data_home="./scikit_learn_data",min_faces_per_person=70,resize=0.4)
lfw_people.keys()
lfw_people.target_names
#输出数据集中人脸的人名
for name in lfw_people.target_names:
    print(name)
#默认的切片是一个矩形包围人脸,去掉了大多数的背景
print(lfw_people.data.dtype)
print(lfw_people.data.shape)
print(lfw_people.images.shape)
#1140个人脸图片中的每一张图片都被分配了一个单独的id在目录target中
lfw_people.target.shape
print(list(lfw_people.target[:10]))
#看fetch_lfw_pairs()函数的用法
这个函数加载的数据集用于人脸验证(face verification)任务,没一个样本是一对人脸图片,可能是同一个人,也可能不是
from sklearn.datasets import fetch_lfw_pairs
lfw_pairs_train=fetch_lfw_pairs(data_home="./scikit_learn_data",subset='train')
lfw_pairs_train.keys()
print(list(lfw_pairs_train.target_names)) # 两类
print(lfw_pairs_train.pairs.shape) #pairs,220个样本,每个样本中2张图像,每个图像都是62*47
print(lfw_pairs_train.data.shape) #data是将上面的pairs数据展开了,2*62*47=5828
print(lfw_pairs_train.target.shape)
#sklearn.datasets.fetch_lfw_people和sklearn.datasets.fetch_lfw_pairs函数都可以获得RGB彩色图像,只是在参数里面指明color=True,这种情况下,矩阵的大小为(2200,2,62,47,3),后面的3说明是3通道的。否则就只是灰度图像
#sklearn.datasets.fetch_lfw_pairs函数加载的数据集被划分成3个子集,训练集,测试集,还有一个10-folds评估集(使用10折交叉验证来评估性能)

3.3Olivetti人脸数据集:fetch_olivetti_faces()

在这里插入图片描述

3.4rcv1多标签数据集:fetch_rcv1()

在这里插入图片描述

3.5Forest covertypes:预测森林表面植被类型

在这里插入图片描述

4计算机生成的数据集

在这里插入图片描述

4.1用于分类任务和聚类任务的

之所以把分类任务和聚类任务数据放在一起,是因为分类和聚类都需要离散的类别标签,

在这里插入图片描述

  1. make_blobs操作示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
centers=[[1,1],[-1,-1],[1,-1]]#指定每个cluster的中心
cluster_std=0.3 # 每个cluster的标准差,cluster_std越大,cluster中的点分布越散。clusters之间不好区分。centers不指定位置
# 仅指定个数的话,cluster的位置就是随机的。
X,labels=make_blobs(n_samples=200,centers=centers,n_features=2,cluster_std=cluster_std,random_state=0)
print('X.shape:',X.shape)
print('labels:',set(labels)) # set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据
# labels是类别标签,但是类别标签是有限的,lebels本身是一个重复数据的集合

#查看X的数据构成
X
# 获取X的第一列
X[:,0]
#np.linspace的用法
print(np.linspace(0,1,len(unique_labels)))

# 将二维点集绘制出来
unique_labels=set(labels) #获取重复标签数据的唯一值
# 为每个类标签指定颜色,plt.cm.Spectral(parameters)中的parameters来指定生成的颜色种类,
# 例如plt.cm.Spectral(np.arange(5))将生成5中不同的颜色
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_labels))) 
# zip()将2个相同长度list封装为一个元组。
for k,col in zip(unique_labels,colors):
    X_k=X[labels==k]
    plt.plot(X_k[:,0],X_k[:,1],'o',markerfacecolor=col,markeredgecolor='k',markersize=14)
    #np.array中,X_k[:,0]表示按列索引,第1列,X_k[:,1],按列索引,第二列。marker,标记。edge,边缘。
plt.title('dataset by make_blob()')
plt.show()
  1. make_classification
import numpy as np
from sklearn.datasets.samples_generator import make_classification
X,labels=make_classification(n_samples=200,n_features=2,n_redundant=0,n_informative=2,random_state=1,n_clusters_per_class=1)
# n_redundant,冗余。n_informative,对分类有用的特征。n_clusters_per_class,每个类有几个点集,可以有2个。
# 最终返回的是样本特征向量和标签
# 给特征向量X加噪声
# np.random.RandomState(),随机数生成器
rng=np.random.RandomState(2)
# numpy.random.uniform(low,high,size),从一个均匀分布[low,high)中随机采样.
X += 2*rng.uniform(size=X.shape)
# 将二维点集绘制出来
import matplotlib.pyplot as plt 
unique_labels=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_labels)))
for k,col in zip(unique_labels,colors):
    X_k=X[labels==k]
    plt.plot(X_k[:,0],X_k[:,1],'o',markerfacecolor=col,markeredgecolor='r',markersize=14)
plt.title('dataset by make_classification()')
plt.show()
  1. make_moons
from sklearn.datasets.samples_generator import make_moons
X,labels=make_moons(n_samples=200,shuffle=True,noise=0.3,random_state=0)
# shuffle=True,乱序。noise=0.3,噪声。
print('X.shape:',X.shape)
print('labels:',set(labels))
# 将二维点集绘制出来
import matplotlib.pyplot as plt 
unique_labels=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_labels)))
for k,col in zip(unique_labels,colors):
    X_k=X[labels==k]
    plt.plot(X_k[:,0],X_k[:,1],'o',markerfacecolor=col,markeredgecolor='k',markersize=14)
plt.title('dataset by make_moons()')
plt.show()
# 结果显示为月亮形的,常用来测试分类器的非线性分类问题,要把这个分开就要用s形判决界面,
# 可以规定两个数据集之间的胶结程度,将他们紧凑一些/拉开一些,就可以测量分类器的分类性能
  1. make_circles
from sklearn.datasets.samples_generator import make_circles
X,labels=make_circles(n_samples=200,noise=0.2,factor=0.2,random_state=1)
# factor=0.2,外圆和内圆半径的比例
print('X.shape:',X.shape)
print('labels:',set(labels))
# 将二维点集绘制出来
import matplotlib.pyplot as plt 
unique_labels=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_labels)))
for k,col in zip(unique_labels,colors):
    X_k=X[labels==k]
    plt.plot(X_k[:,0],X_k[:,1],'o',markerfacecolor=col,markeredgecolor='k',markersize=14)
plt.title('dataset by make_circles()')
plt.show()
# 现在图上看上去是扁图,其实就是圆的,是在这里显示的问题,可以弹出来看。

4.2make_multilabel_classification,多标签随机样本

在这里插入图片描述

4.3用于回归任务的

在这里插入图片描述

4.4用于流形学习的

在这里插入图片描述

s形曲线:make_s_curve().瑞士卷,make_swiss_roll()

4.4用于因子分解的

产生的是稀疏矩阵,

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值