sklearn库基本框架和数据库的调用
文章目录
在正式开始学习之前,个人想做一点简单的说明,由于我是一名工科学生,可能侧重点会放在机器学习实战上,理论上的东西可能会介绍的少一点,望见谅。
本章源码地址:https://github.com/mfp0610/code_of_sklearn.git 在第一个basic_and_dataset文件夹中
sklearn库的基本框架
下面这张图片是sklearn官网中给出的基本框架:
我们可以看到,sklearn库分为六大模块,分别用于完成:分类任务、回归任务、聚类任务、降维任务、模型选择以及数据的预处理。包括了有监督学习,无监督学习的各种算法,以及一些对参数和模型的调整和数据的预处理工具,可以说是目前为止最完善的ml代码包。
一些经典的分类模型和加载模块:
分类模型 | 加载模块 |
---|---|
最近邻算法 | neighbors.NearestNeighborsneural_network.MLPClassifier |
支持向量机 | svm.SVC |
朴素贝叶斯 | naive_bayes.GaussianNB |
决策树 | tree.DecisionTreeClassifier |
集成方法 | ensemble.BaggingClassifier |
神经网络 | neural_network.MLPClassifier |
一些经典的回归模型和加载模块:
回归模型 | 加载模块 |
---|---|
岭回归 | linear_model.Ridge |
Lasso回归 | linear_model.Lasso |
弹性网络 | linear_model.ElasticNet |
最小角回归 | linear_model.Lars |
贝叶斯回归 | linear_model.BayesianRidge |
逻辑回归 | linear_model.LogisticRegression |
多项式回归 | preprocessing. PolynomialFeatures |
一些经典的聚类方法和加载模块:
聚类方法 | 加载模块 |
---|---|
K-means | cluster.KMeans |
AP聚类 | cluster.AffinityPropagation |
均值漂移 | cluster.MeanShift |
层次聚类 | cluster.AgglomerativeClustering |
DBSCAN | cluster.DBSCAN |
BIRCH | cluster.Birch |
谱聚类 | cluster.SpectralClustering |
一些经典的降维方法和加载模块:
降维方法 | 加载模块 |
---|---|
主成分分析 | decomposition.PCA |
截断SVD和LSA | decomposition.TruncatedSVD |
字典学习 | decomposition.SparseCoder |
因子分析 | decomposition.FactorAnalysis |
独立成分分析 | decomposition.FastICA |
非负矩阵分解 | decomposition.NMF |
LDA | decomposition.LatentDirichletAllocation |
sklearn数据库及其调用
sklearn主要有下面这几种数据库:
类型 | 获取方式 |
---|---|
自带的小数据集 | sklearn.datasets.load_ |
在线下载的数据集 | sklearn.datasets.fetch_ |
计算机生成的数据集 | sklearn.datasets.make_ |
svmlight/libsvm格式的数据集 | sklearn.datasets.load_svmlight_file(…) |
mldata.org在线下载数据集 | sklearn.datasets.fetch_mldata(…) |
这里主要探究前三种数据库以及其加载方式,后面几种暂时不做探究,其实主要是我也不会(划掉)。
自带的小数据库
返回的是一个bunch对象,字典类型:
名称 | 加载模块 |
---|---|
鸢尾花数据集 | load_iris() |
乳腺癌数据集 | load_breast_cancer() |
手写数字数据集 | load_digits() |
糖尿病数据集 | load_diabetes() |
波士顿房价数据集 | load_boston() |
体能训练数据集 | load_linnerud() |
图像数据集 | load_sample_image(name) |
鸢尾花数据集
首先我们尝试载入鸢尾花数据集并画一张其数据在两个维度上的散点图:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris #载入鸢尾花数据集
iris=load_iris()
iris.keys()
#首先我们来看一下这个数据集的基本信息
n_samples,n_features=iris.data.shape
print("Number of sample:",n_samples) #输出数据个数
print("Number of feature",n_features) #输出数据的维数
print(iris.data[0]) #输出第一组数据的具体参数
print(iris.target) #输出各个数据分类
print(iris.target_names) #输出三种标签名称
#画一张散点图,第一维的数据作为x轴,第二维的数据作为y轴
x_dim=0 #x轴为第一维
y_dim=1 #y轴为第二维
colors=['blue','red','green'] #用三种颜色标记三个标签
for lab,color in zip(range(len(iris.target_names)),colors):
plt.scatter(iris.data[iris.target==lab,x_dim],
iris.data[iris.target==lab,y_dim],
label=iris.target_names[lab],
color=color,s=10.) #scatter做散点图
plt.xlabel(iris.feature_names[x_dim]) #在x轴上标记第一维标签名
plt.ylabel(iris.feature_names[y_dim]) #在y轴上标记第二位标签名
plt.legend(loc='upper left') #左上角标记标签
plt.show() #展示图形
输出如下:
画出的散点图如下:
在输出数据和图像中输出中,我们可以看到关于这个数据集很详细的信息,包括数据的维度,各个维度数据的值,以及标签的个数,每个数据点的标签。很显然这个是已经做了标注的数据,应该是用于训练有监督学习模型的,当然我们能不能忽视他的标签人为对他进行聚类,进行无监督学习或者半监督学习的操作,也是之后可以尝试的一个玩法,在此先留一个坑,日后补上。(—坑---)
mnist手写数字数据集
然后我们尝试载入mnist手写数据集,这是一个非常经典的图像数据集:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits #载入mnist手写数字数据集
digits=load_digits()
digits.keys()
#首先我们来看一下这个数据集的基本信息
n_samples,n_features=digits.data.shape
print("Number of sample:",n_samples) #输出数据个数
print("Number of feature",n_features) #输出数据的维数
print(digits.images.shape)
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(81):
ax=fig.add_subplot(9,9,i+1,xticks=[],yticks=[])
ax.imshow(digits.images[i],cmap=plt.cm.binary)
ax.text(0,7,str(digits.target[i])) #用标签值标记图像
plt.show()
输出结果如下:
展示的图像如下:
恕我直言,有的图像我人眼都看不出来是啥,就别难为我的算法了。哭。
图像数据集
我们载入其中一张图片,并且看一下它的基本信息:
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image
china=load_sample_image("china.jpg")
print(china.dtype)
print(china.shape)
plt.imshow(china)
plt.show()
输出如下:
显示图像如下:
其他数据集
其他的数据集在这里只给出一些简单的介绍:
乳腺癌数据集:简单经典的用于二分类任务的数据集。
糖尿病数据集:经典的用于回归认为的数据集,有趣的一点是,这10个特征中的每个特征都已经被处理成0均值,方差归一化的特征值。
波士顿房价数据集:经典的用于回归任务的数据集。
体能训练数据集:经典的用于多变量回归任务的数据集,其内部包含两个小数据集:Excise是对3个训练变量的20次观测(体重,腰围,脉搏),physiological是对3个生理学变量的20次观测(引体向上,仰卧起坐,立定跳远)。
在线下载的数据集
20类新闻文本数据集
这个数据集中包含了关于20个话题的18000+条新闻报道,被分为两个子集: 训练集和测试集。
这个数据集有两种调用方式:使用 fetch_20newsgroups() 调用只能得到原始的文本列表,该文本可以被输入到文本特征提取器sklearn.feature_extraction.text.CountVectorizer进一步处理得到特征向量。而采用另一种调用方式 fetch_20newsgroups_vectorized() 就返回一个直接可以使用的特征,无须在进行特征提取。
from sklearn.datasets import fetch_20newsgroups #载入新闻文本数据集
from sklearn.feature_extraction.text import TfidfVectorizer
news_train=fetch_20newsgroups(subset='train')
news_train.keys()
print(news_train.target_names)
print(news_train.data[:1]) #打出第一条数据的详细内容
print(news_train.target.shape) #打出数据规模
#提取tf-idf向量
cat=['alt.atheism','talk.religion.misc','comp.graphics','sci.space']
news_train=fetch_20newsgroups(subset='train',categories=cat)
vector=TfidfVectorizer()
vectors=vector.fit_transform(news_train.data)
print(vectors.shape)
print(vectors.nnz/float(vectors.shape[0]))
#从中我们可以看到数据非常稀疏,每一维只有159个向量
然后我们可以得到这样的输出,这里我们提取的tf-idf向量是文本挖掘中的重要特征,以后会详细描述。
得到的输出结果如下:
从中我们可以看到数据非常稀疏,每一维只有159个向量。
Olivetti人脸数据集
Olivetti人脸数据集是AT&T在1992-1994年手机的人脸数据集,包含了40个不同的目标,每个目标10张图片,某些目标的图像在不同的时间段采集,带有光照,面部表情(眼镜开闭,笑容),面部袭细节的各种变化,所有的人脸图像被正立的放在一个灰色的背景上。
每一张图像上有256个灰度级,用无符号8为来存。加载函数会将所有的图像转换成[0,1]区间上的浮点数,目标值target存放着0到39的数字代表人脸的类别标签。然而每个标签对应的人脸图像都只有10张,每张图像的分辨率是64*64。这个小数据集会更加适合来做无监督学习或者半监督学习。
生成的数据集
sklearn库中生成数据集的功能很强的,可以生成用于分类任务,回归任务,聚类任务,流形学习,因子分解任务等多种情景下的数据集。下面我们就介绍一些用于分类任务和聚类任务的的函数,所产生样本特征向量矩阵以及对应的类别标签集合:
make_blobs:多类单标签数据集,为每个类分配一个或多个正态分布的点集。
make_classification:多类单标签数据集,为每个类分配一个或多个正态分布的点集,此外,还提供了为数据添加噪声的方式,包括维度相关性,无效特征以及冗余特征等。
make_gaussian-quantiles:将一个单高斯分布的点集划分为两个数量均等的点集,作为两类。
make_hastie-10-2:产生一个相似的二元分类数据集,有10个维度。
make_circle/make_moom:产生二维二元分类数据集来测试某些算法的性能,可以为数据集添加噪声,可以为二元分类器产生一些球形判决界面的数据。
下面我们就尝试生成三种不一样的数据集,并且画一下他的散点图来看看效果:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.datasets.samples_generator import make_classification
from sklearn.datasets.samples_generator import make_circles
fig=plt.figure(figsize=(18,4))
fig.subplots_adjust(left=0.1,right=0.9,bottom=0.1,top=0.9,hspace=0.15,wspace=0.15)
#生成多类单标签数据集
plt.subplot(131)
X,labels=make_blobs(n_samples=200,centers=[[1,1],[-1,-1],[1,-1]],n_features=2,
cluster_std=0.3,random_state=0)
unique_lables=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_lables)))
for k,col in zip(unique_lables,colors):
x_k=X[labels==k]
plt.plot(x_k[:,0],x_k[:,1],'o',
markerfacecolor=col,markeredgecolor="k",markersize=14)
plt.title('data by make_blob()')
plt.subplot(132)
#生成用于分类的数据集
X,labels=make_classification(n_samples=200,n_features=2,n_redundant=0,n_informative=2,
random_state=1,n_clusters_per_class=2)
rng=np.random.RandomState(2)
X+=2*rng.uniform(size=X.shape)
unique_lables=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_lables)))
for k,col in zip(unique_lables,colors):
x_k=X[labels==k]
plt.plot(x_k[:,0],x_k[:,1],'o',markerfacecolor=col,markeredgecolor="k",
markersize=14)
plt.title('data by make_classification()')
plt.legend(loc='upper left')
plt.subplot(133)
#生成球形判决界面的数据
X,labels=make_circles(n_samples=200,noise=0.2,factor=0.2,random_state=1)
unique_lables=set(labels)
colors=plt.cm.Spectral(np.linspace(0,1,len(unique_lables)))
for k,col in zip(unique_lables,colors):
x_k=X[labels==k]
plt.plot(x_k[:,0],x_k[:,1],'o',
markerfacecolor=col,markeredgecolor="k",markersize=14)
plt.title('data by make_moons()')
plt.show()
结果显示如下:
一些啰嗦的题外话
至此,我们对sklearn数据库的了解就已经告一段落了。
讲实话,虽然之前呜呜喳喳加入了不少组和项目,但这次尝试其实是本蒟蒻第一次真正自己动手写py的代码,虽然没有写什么实质性的算法,都是在调一些包。但我确实深刻地感到了py的优越性,包多功能强大,代码简洁灵活,建议还没入py坑的朋友尽快入坑吧,确实是门出色的编程语言。
参考资料
1.skLearn官网:https://scikit-learn.org/stable/index.html
2.中国大学mooc《Python机器学习应用 》-北京理工大学:https://www.icourse163.org/course/BIT-1001872001
3.博客文章 SKLearn数据集API(一):https://www.jianshu.com/p/688a9cf3b5a8
4.博客文章 sklearn提供的自带的数据集:https://www.cnblogs.com/nolonely/p/6980160.html
5.文章 如何在Python中用scikit-learn生成测试数据集:https://www.jiqizhixin.com/articles/2018-02-05-2
6.博客文章 【Python】 【绘图】plt.figure()的使用:https://blog.csdn.net/m0_37362454/article/details/81511427