编辑推荐: |
本文来自于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: 利用深度网络,可以实现深度强化学习,得到较好的学习效果。该方法直接学习环境和动作状态函数的映射关系,得到问题的解。
|