机器学习scikit-learn使用

栏目: 数据库 · 发布时间: 5年前

内容简介:Scikit-learn安装sklearn库依赖于numpy、scipy、matplotlib库,首先安装numpy,然后安装scipy、matplotlib库,最后安装scikit-learn库。可以通过anaconda进行安装或者通过依赖关系,逐个进行pip install进行安装。Scikit-learn的数据集介绍
编辑推荐:

本文来自于csdn,本文是一篇机器学习Scikit-learn的笔记,主要介绍Scikit-learn的安装和使用,希望会对您的学习有所帮助。

Scikit-learn安装

sklearn库依赖于numpy、scipy、matplotlib库,首先安装numpy,然后安装scipy、matplotlib库,最后安装scikit-learn库。可以通过anaconda进行安装或者通过依赖关系,逐个进行pip install进行安装。

Scikit-learn的数据集介绍

scikit-learn数据集如下图所示,包括了小数据集和大数据集,采用函数方法调用。

机器学习scikit-learn使用

# 加载boston房价信息示例
 from sklearn.datasets import load_boston
 data, target = load_boston(return_X_y=True)
 print(data.shape)
 print(target.shape)
#加载手写数字库
 from sklearn.datasets import load_digits
 import matplotlib.pyplot as plt
 digits = load_digits()
 plt.matshow(digits.images[3])
 plt.show()
 

sklearn库包括6大部分,包括分类、回归、聚类、降维、模型选择以及数据预处理。具体的函数如下图所示:

机器学习scikit-learn使用

机器学习scikit-learn使用

机器学习scikit-learn使用

机器学习scikit-learn使用

Sklearn无监督学习使用

无监督学习采用无标签数据,处理数据分布或者数据关系,包括聚类和降维。

聚类采用距离进行衡量样本的分类情况,可以采用欧氏距离、曼哈顿距离、马氏距离(包含了属性的标准差)、余弦相似度(向量相似度的一个方面)。

sklearn聚类算法包含于sklearn.cluster中,包含了k-means、邻近传播算法、DBSCAN等。

sklearn.cluster可以采用多种数据形式作为输入,标准形式为[样本个数 特征个数],还可以采用其他方式进行。

机器学习scikit-learn使用

降维,在保证数据所具有的特征情况下,将高维数据转化为低维数据的过程,可用于数据可视化或者精简数据的作用。

sklearn降维算法包含于sklearn.decomposition,目前有7种降维算法。

机器学习scikit-learn使用

聚类之kmeans方法使用

kmeans算法将数据分为k个簇,簇内相似度较高,簇间相似度较低。其操作过程如下图所示。

机器学习scikit-learn使用

涉及到的过程包括:如何随机选取k个点;如何计算其余点与选取点的距离;如何计算每一类的均值;如何判断停止;如何证明有效性。

采用kmeans进行聚类操作,数据为31个身份居民家庭平均支出,包含8个维度数据,对于31个省份进行聚类。

选取数据点采用了Kmeans的初始化算法方法,由于没有数据,这里采用load_iris()数据进行分类,存在一定的分类误差,大约有0.09~0.11的分类误差。

from sklearn.cluster import KMeans
 from sklearn.datasets import load_iris
 if __name__ == '__main__':
 # import iris data: x is the iris feature and y is the class
 x, y = load_iris(return_X_y=True)
 # the number clusters is 3
 km = KMeans(n_clusters=3,init='k-means++', max_iter=10000)
 label = km.fit_predict(x)
 # evaluate the accuracy
 error_cnt = 0
 sum_cnt = 0
 for i in range(len(label)):
 if (y[i] != label[i]):
 error_cnt =error_cnt + 1
 sum_cnt = sum_cnt + 1
 print("Error rate:%.2f" % (error_cnt/sum_cnt))
 

kmeans可以用于图像分割,即利用图像分灰度、颜色、纹理、形状等特征将图像分为若干不重叠区域,使这些特征在同一区域具有相似性而不同区域呈现冥想差异性。图像分割常用技术包括了阈值分割、边缘分割、直方图法和聚类分析、小波变换等。kmeans分割可以实现图像中相似特征聚类,从而完成分割情况。对于同一类采用相同颜色标记,最终可以形成分割图像。实例如下,一个较重要的包为PIL,实例代码如下:

import PIL.Image as image
 def loadData(filePath):
 f = open(filePath,'rb')
 data = []
 img = image.open(f)
 m,n = img.size
 for i in range(m):
 for j in range(n):
 x,y,z = img.getpixel((i,j))
 data.append([x/256.0,y/256.0,z/256.0])
 f.close()
 return np.mat(data),m,n
 

聚类之DBSCAN方法使用

DBSCAN基于密度进行聚类,不需要指定聚类个数。DBSCAN算法将数据点分为三类:核心点、边界点和噪音点,这依据一点的邻域eps内其他点个数的情况是否大于minpts来决定。

算法流程如下所示,第一步包括了计算每一个点邻域eps距离内的点,超过minpts个数,则记该点为核心点;然后查看剩余点是否在邻域内,如果在则为邻域点;否则为噪声点。第二步为删除噪声点;第三步为连接距离在eps内的核心点,构成一个簇;第四步,指定边界点归类于哪一个簇。

机器学习scikit-learn使用

# 统计每一类别元素个数的代码
 for i in range(0,nc):
 numberOfClass.append(len(label[label[:] == i]))
 print(numberOfClass)

# 统计分类个数的代码

n_clusters = len(set(labels))-(1 if -1 in labels else 0)

# DBSCAN核心代码

db = DBSCAN(eps=1,min_samples=20).fit(x)

labels = db.labels_

DBSCAN基于密度分布进行聚类,对于iris数据难以实现有效聚类。

python 源码看,DBSCAN与KNN存在一定的联系。从实际操作而言,DBSCAN与kmeans均存在距离计算步骤,这也是聚类算法的一个必须步骤;对于距离情况,kmeans采取最短距离归类原则,这符合统计情况;而DBSCAN则采取一定的threshold,对于部分噪声数据可以进行过滤。

降维之PCA

PCA,主成分分析,较为常用的一种降维方法,可以用于高维数据的探索和可视化,还可以用作数据压缩和预处理。

矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的为第一主成分,其次为第二主成分。样本的PCA算法如下所示:

机器学习scikit-learn使用

在sklearn库中,可以使用sklearn.decomposition.PCA进行降维,关键参数有主成分个数n_components和svd_solver。采用PCA可以对于iris数据集进行降维操作。

# 原数据为四维的,使用PCA对数据进行降维,
 # 实现在二维平面的可视化
 import matplotlib.pyplot as plt
 from sklearn.decomposition import PCA
 from sklearn.datasets import load_iris
 # 加载数据集导入函数
 data = load_iris()
 # 以字典形式加载数据集
 y = data.target
 # y表示数据集中的标签
 X = data.data
 # x表示数据集中的属性数据
 pca = PCA(n_components=2)
 # 加载pca算法,主成分数目为2
 reduced_X = pca.fit_transform(X)
 # 对原始数据进行降维,保存在reduced_X中
 red_x, red_y = [], []
 blue_x, blue_y = [], []
 green_x, green_y = [], []
 # 按类别将降维后的数据进行保存
 for i in range(len(reduced_X)):
 # range(5) #代表从0到5(不包含5)
 if y[i] == 0:
 red_x.append(reduced_X[i][0])
 red_y.append(reduced_X[i][1])
 elif y[i] == 1:
 blue_x.append(reduced_X[i][0])
 blue_y.append(reduced_X[i][1])
 else:
 green_x.append(reduced_X[i][0])
 green_y.append(reduced_X[i][1])
 # 按照鸢尾花的类别将降维后的数据点保存在不同的列表中
 plt.scatter(red_x, red_y, c='r', marker='x')
 # 画x关于y的散点图,c:color,r:red。
 # maker:标记点的形状。x:x形;D:钻石形;.:点形
 plt.scatter(blue_x, blue_y, c='b', marker='D')
 plt.scatter(green_x, green_y, c='g', marker='.')
 plt.show()
 

降维之NMF

NMF,非负矩阵分解,是在矩阵所有元素为非负数这一条件约束情况下的矩阵分解方法。其思想为,对于一个非负矩阵,可以找到另外的矩阵W和H,这两者也是非负矩阵,使得W乘以H接近矩阵V。其中W矩阵称为基础图像矩阵,而H矩阵为系数矩阵。W矩阵类似于V矩阵中抽取的特征。

NMF的算法需要进一步进行探究,可以使用NMF方法进行,关键参数有n_components,init表示W和H矩阵的初始化方法。

实作的对象为olivetti人脸数据集,包含400张人脸数据,每张图像为64*64大小,也就是说原始的数据具有4096个维度。可以采用NMF进行降维,经过调整最终的特征个数可以为6个,也就是说降维后的数据集为400张*6个特征。(待确定)

NMF和PCA可以直接替代使用,二者参数接近。

Sklearn监督学习使用

监督学习的目标是利用一组带有标签的数据,构成一个从输入到输出的映射,然后将这种映射关系应用到未知数据,达到分类或回归的目的。

sklearn库中分类算法未被统一封装,因此其import方式各有不同,其分类算法包括了KNN,朴素贝叶斯,SVM,决策树,神经网络模型等等,既有线性分类器,也有非线性分类器。

回归分析则是用于分析多个变量的相关性,由于给出在自变量变化时,因变量的变化情况。一般而言,通过回归分析可以得到由自变量给出因变量的条件期望。

sklearn库的回归函数封装在linear_model和prepocessing中,其中线性回归函数包括线性回归、岭回归、LASSO回归,非线性回归如多项式回归等。

分类之KNN

KNN的基本思想是通过计算待分类数据与训练集数据的距离,取前K个点,将待分类数据划分到出现次数最多的那个类别。

sklearn中采用sklearn.neighbors.KNeighborsClassifier创建K近邻分类器,关键参数包括n_neighbors和weights。为了能够对于大数据进行处理,可以采用合适的计算临近点的方法。实际使用过程中,倾向于使用较小的K,并且使用交叉验证得到最优的K值。

# KNN简易代码
 from sklearn.neighbors import KNeighborsClassifier
 x = [[0],[1],[2],[3]]
 y = [0,0,1,1]
 neigh = KNeighborsClassifier(n_neighbors=3)
 neigh.fit(x,y)
 print(neigh.predict([[1.1]]))
 

分类之决策树

构建过程为特征的信息增益,分类时只需要根据决策树的节点进行判断,从而得到所属类别。

sklearn可以使用sklearn.tree.DecisionTreeClassifier进行分类,参数有criterion,可以选择gini或者entropy;max_features可以选择决策树节点进行分类时,从多少个特征中选取最优特征。

其本质是一种寻找一种对特征空间的划分,从而构建一个对于训练数据拟合好,并且复杂度小的决策树。

from sklearn.datasets import load_iris
 from sklearn.tree import DecisionTreeClassifier
 from sklearn.model_selection import cross_validate
 # 默认使用gini分类,这里采用entropy分类
 clf = DecisionTreeClassifier(criterion='entropy')
 iris = load_iris()
 print(cross_validate(clf,iris.data,iris.target,cv=10))
 

分类之朴素贝叶斯

朴素贝叶斯,naive bayes,为典型的生成学习方法,通过训练数据得到联合分布,然后求取后验概率。对于小规模、多分类任务。

在sklearn库中有以下三类贝叶斯分类器,naive_bayes.GaussianNB,分别针对高斯朴素贝叶斯、针对多项式模型的朴素贝叶斯和针对多元伯努利模型的朴素贝叶斯,其区别在于假设某一特征的观测值属于某一特定分布。

# 朴素贝叶斯示例代码
 import numpy as np
 from sklearn.naive_bayes import GaussianNB
 X = np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
 Y = np.array([1,1,1,2,2,2])
 clf = GaussianNB(priors=None)
 clf.fit(X,Y)
 print(clf.predict([[-0.8,-1]]))
 

分类之SVM

SVM分类方法在sklearn.svm.SVC中,代码如下所示,需要设置kernel参数,例如rbf,linear,poly,sigmoid等。同时针对本分类,可以产生训练集和测试集。

from sklearn.datasets import load_iris
 from sklearn.model_selection import cross_validate
 from sklearn import svm
 clf = svm.SVC(kernel='rbf')
 x,y = load_iris(return_X_y=True)
 print(cross_validate(clf,x,y,cv=10))
 

分类之MLP

MLP,即多层全连接神经网络。对于DBRHD数据集,其大小为32*32的文本矩阵,而MLP采用向量输入,因此需要展开文本矩阵,输出采用one-hot vectors。Hidden layer的层数和神经元个数均会影响识别准确率。

clf = MLPClassifier(hidden_layer_sizes=(100,),
 activation='logistic', solver='adam',
 learning_rate_init = 0.0001, max_iter=2000)
 print(clf)
 clf.fit(train_dataSet,train_hwLabels)
 #read testing dataSet
 dataSet,hwLabels = readDataSet('testDigits')
 res = clf.predict(dataSet) #对测试集进行预测
 

数据的处理方法

sklearn提供了数据预处理模块Imputer,自动生成训练集和测试集的模块train_test_split,预测结果评估模块classification_report。注意,train_test_split已经被删除。

from sklearn.preprocessing import Imputer
 from sklearn.cross_validation import train_test_split 
 from sklearn.metrics import classification_report
 

可以采用pandas模块读取数据文件,可以处理分隔符,缺失值且去除表头行。处理缺失值代码如下所示。这里由于存在多个分散文件,因此使用了np.concatenate进行文件数据合并。

 df = pd.read_table(file, delimiter=',', na_values='?', header=None)
 imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
 imp.fit(df)
 df = imp.transform(df)
 feature = np.concatenate((feature, df))
 

train_test_split函数可以将数据顺序打乱,而classification_report可以生成数据分类的结果准确度。

print(classification_report(y_label, y_clf_result))

对于数据,需要进行特征选择,可以借助辅助软件进行数据可视化。

对于CSV文件,可以通过pandas模块的read_csv函数进行处理,数据可以进行 排序 操作,这对于时间序列数据尤其有用。

机器学习scikit-learn使用

对于时间序列函数,可以指定特定的前序时间进行特征分析,而后的时间作为结果label,如下分析所示。初始数据有200天的结果,使用前序150天作为training set。因此最终的样本包括了50条,每一条样本的数据包括了前150天的各特征,该特征是二维数组形式,因此需要进行reshape操作。

机器学习scikit-learn使用

回归之线性回归和多项式回归

线性回归利用最小二乘法,对于回归方程进行求解,最终可以得到GD等多种优化迭代方法。

回归分析的关键代码如下所示,使用的函数为sklearn.linear_model.LinearRegression(),fit()用于拟合输入输出数据。

多项式回归本质也是线性回归,因为参数对于输出是线性的。对于多项式回归,sklearn提供了预处理方法,构造多项式特征。

from sklearn.prepocessing import PolynomialFeatures
 poly_reg = PolynomialFeatures(degree = 2)
 X_poly = poly_reg.fit_transform(datasets_X)
 lin_reg_2 = linear_model.LinearRegression()
 lin_reg_2.fit(X_poly, datasets_Y)
 

回归之岭回归

对于回归分析而言,最小二乘法的解析解存在不稳定情况。也就是存在一个转置项,由于X的某些列线性相关度较大,容易出现$X^TX$接近0。对于接近于零的情况具有不稳定性。因此可以通过引入正则项进行解决,这称为岭回归,如下图所示:

机器学习scikit-learn使用

在sklearn库中,可以调用sklearn.linear_model.Ridge,参数有alpha,对应正则化因子,fit_intercept表示是否计算截距,solver指定求解器。实例中指定的alpha=1.0。

强化学习及简单游戏训练

强化学习是程序agent通过与环境不断进行交互学习,得到从环境到动作的映射,从而使得累计汇报最大化。

马尔可夫决策过程,MDP,是一种较为常用的强化学习过程,该学习方法需要获得环境的状态以及可能采取动作的状态。

现实中,对于环境的转移概率和奖励函数很难得到,因此可以采用不依赖于环境进行建模的学习算法,称为免模型学习,蒙特卡洛强化学习就是其中一类,采用多次采样获得平均的累计奖赏。更强的学习方法为Q-learning算法。

DQN: 利用深度网络,可以实现深度强化学习,得到较好的学习效果。该方法直接学习环境和动作状态函数的映射关系,得到问题的解。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Django

Pro Django

Marty Alchin / Apress / 2008-11-24 / USD 49.99

Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具