Press "Enter" to skip to content

机器学习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数据集如下图所示,包括了小数据集和大数据集,采用函数方法调用。

 

 

# 加载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大部分,包括分类、回归、聚类、降维、模型选择以及数据预处理。具体的函数如下图所示:

 

 

 

 

 

Sklearn无监督学习使用

 

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

 

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

 

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

 

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

 

 

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

 

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

 

 

聚类之kmeans方法使用

 

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

 

 

涉及到的过程包括:如何随机选取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内的核心点,构成一个簇;第四步,指定边界点归类于哪一个簇。

 

 

# 统计每一类别元素个数的代码
 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算法如下所示:

 

 

在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函数进行处理,数据可以进行排序操作,这对于时间序列数据尤其有用。

 

 

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

 

 

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

 

线性回归利用最小二乘法,对于回归方程进行求解,最终可以得到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。对于接近于零的情况具有不稳定性。因此可以通过引入正则项进行解决,这称为岭回归,如下图所示:

 

 

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

 

强化学习及简单游戏训练

 

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

 

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

 

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

 

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

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注