从负无穷学习机器学习(一)

我的梦境 提交于 2019-12-14 11:09:19

适逢双十一,买了一本名为《深入浅出Python机器学习》的书,作者生动描述机器学习的原理,爱了!ヾ(◍°∇°◍)ノ゙

一、基础必需的库

(一)、numpy——基础科学计算库

import numpy#基础科学计算库
i = numpy.array([[1,2,3],[4,5,6]])#为i赋值一个数组
print("i:\n{}".format(i))#输出数组i

在这里插入图片描述

(二)、scipy——科学计算工具集

import numpy as np
from scipy import sparse

matrix = np.eye(3)#创建一个3阶对角阵

sparse_matrix = sparse.csr_matrix(matrix)#把np数组转化成CSR格式的Scipy稀疏矩阵(sparse matrix)
#sparse函数只会存储非0元素

print("对角矩阵:\n {}".format(matrix))#打印数组
print("\n sparse matrix:\n{}".format(sparse_matrix))

#上下两矩阵进行对比

(三)、pandas——数据分析

#导入数据分析工具
import pandas
data = {"Name":["seanOY","sillyM"],
       "City":["A City", "Z City"],
       "Age":["22", "22"]}
data_frame = pandas.DataFrame(data)
display(data_frame)

(四)、matplotlib

#允许jupyter notebook进行内置实时绘图,不添加这一句则需要在句末添加plt.show()
%matplotlib inline
#导入matplotlib
import matplotlib.pyplot as plt
#生成范围为-20~20,等差值为10的等差数列
x = np.linspace(-20,20,10)
y = x**3 + 2*x**2 + 6*x + 5
#画出上面函数的曲线
plt.plot(x, y, marker = "o")

二、机器学习库——scikit-learn

scikit-learn包含很多顶级机器学习算法,它被主要用于分类、回归、聚类、数据降维、模型选择和数据预处理。

(一)、K最近邻算法概要

K最近邻算法(K-Nearest Neighbors, KNN)的基本原理就是计算新数据点跟n个离它最近的(已分类)数据点的距离,根据各类数据点的个数所占比重最大者对新数据点进行分类。例如离待分类的A点有三个离它最近的已分类的点BCD,其中有两个灰色点BC和一个黑色点D,则A点就归为BC点所属的灰色类中。

(二)、K最近邻算法处理数据分类问题

#导入数据集生成器
from sklearn.datasets import make_blobs
#导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
#导入画图工具
import matplotlib.pyplot as plt
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#生成样本数为200,分类数为2的数据集
data = make_blobs(n_samples = 200, centers = 2, random_state = 8)
X, y = data
# 将生成的数据可视化
plt.scatter(X[:,0],X[:,1], c=y, cmap = plt.cm.spring, edgecolor = 'k')
plt.show()# 显示数据

使用K最近邻算法处理上面生成的数据集。

#导入基础科学计算库
import numpy as np
clf = KNeighborsClassifier()
#拟合数据
clf.fit(X,y)

#下面代码用于画图
x_min, x_max = X[:,0].min() - 1, X[:,0].max() + 1#确定坐标值上下限
y_min, y_max = X[:,1].min() - 1, X[:,1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),# arange()用于创建等差数列
                     np.arange(y_min, y_max, .02))#创建网格
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)
plt.scatter(X[:,0], X[:,1], c=y, cmap=plt.cm.spring, edgecolor = 'k')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("Classifier:KNN")

plt.show()# 显示

若假设有一个数据点的特征值分别是7和5,需要将它进行分类,我们可以在plt.show()之前添加代码,并输出新数据点所在位置。

plt.scatter(7, 5, marker='*', c='red', s=200)
#前两个元素为位置,marker为表示的形状,c为颜色,s为'点'的尺寸
print("\n新数据点归类为:", clf.predict([7,5]), "\n")

(三)、K最近邻算法处理较复杂的数据集分类

#生成样本数为500,分类数为5的数据集
data2 = make_blobs(n_samples=500, centers=5, random_state=8)
X2, y2 = data2#用散点图表示数据集
plt.scatter(X2[:,0],X2[:,1], c=y2, cmap=plt.cm.spring, edgecolors='k')
plt.show()

使用K最近邻算法拟合数据集,如下图所示。

clf = KNeighborsClassifier()
clf.fit(X2,y2)

# 画图
x_min, x_max = X2[:,0].min() - 1, X2[:,0].max() + 1#确定坐标范围
y_min, y_max = X2[:,1].min() - 1, X2[:,1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)
plt.scatter(X2[:,0], X2[:,1], c=y2, cmap=plt.cm.spring, edgecolors='k')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("Classifier:KNN")
plt.show()

可以看到中间两个集合有交叉部分,就是说难免会有一些数据点被错误分类,我们可以通过函数score()来获得正确率。可以看出来分数挺高的!

# 获得K最近邻算法分数
print("KNN 模型得分:{:.2f}\n".format(clf.score(X2, y2)))

在这里插入图片描述

(四)、K最近邻算法用于回归分析

sklearn数据集中有一个名为make_regression可用于回归分析的数据集生成器。

import matplotlib.pyplot as plt
#导入make_regression数据集生成器
from sklearn.datasets import make_regression
#生成特征数量为1,噪声为50的数据集
X, y = make_regression(n_features=1, n_informative=1, noise=50, random_state=8)
# 用散点图将数据点进行可视化
plt.scatter(X, y, c='orange', edgecolors='k')
plt.show()

#导入用于回归分析的KNN模型
from sklearn.neighbors import KNeighborsRegressor
import numpy as np
reg = KNeighborsRegressor()
#用KNN模型拟合数据
reg.fit(X, y)
#把预测结果可视化
z = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='orange',edgecolors='k')
plt.plot(z, reg.predict(z),c='k',linewidth=3)
#添加标题
plt.title('KNN Regressor')
plt.show()

可以看到有大量数据点没有在拟合曲线附近,得知这个回归模型的拟合程度不太好@_@。

print("KNN Regressor Score:{:.2f}".format(reg.score(X,y)))

在这里插入图片描述

为了提高模型分数,可以适当减少K最近邻算法的n_neighbors数(默认为5)。例如降低为2,结果如下图所示。可以看到黑线覆盖的数据点变多了,事实上是因为约束它的点(n_neighbors)少了,它就可以表现得更自由,拟合得更准确,但同时模型也变得更复杂。

三、K最近邻算法实战——酒的分类

scikit-learn数据集中包含一个关于酒类的集合,我们可以用它来嘿嘿嘿^^。

(一)、分析数据集

这个集合是一种bunch对象,它包括键(keys)和键值(values),可以通过keys()函数查看数据集的键。

#从sklearn载入酒类数据集
from sklearn.datasets import load_wine
wine_dataset = load_wine()
print("wine keys:{}".format(wine_dataset.keys()))

其中“data”为数据,“target”为目标分类,“target_names”为分类名,“DESCR”为描述(description),“feature_names”为特征变量名。

那么这个数据集中的样品数(samples)和变量数(features)捏,可以用.shape语句获取数据的大致轮廓。由下图可看到可以看到总共有178个样本,每个样本有13个特征变量。

print("data outline:{}".format(wine_dataset['data'].shape))

在这里插入图片描述

要获取更详细的信息,也可参照上述方法通过键来获取信息。可以获取到相当长的一段信息,截取其中最重要的描述。

print("data outline:{}".format(wine_dataset['DESCR']))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-szwF74Nc-1576289793949)(en-resource://database/3041:0)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5WDRt58-1576289793950)(en-resource://database/3043:0)]

可以看到178个样本被分为3类,class_0/class_1/class_2,分别含有59/71/48个样本。而特征变量有13个,有酒精含量、苹果酸、花青素浓度、酚类浓度等信息。

(二)、生成和测试训练数据集

就像淘x上的买家秀和卖家秀一样,同一件衣服不同的人穿起来的效果可能是天差地别的。就是说同一个模型放到不同的数据上效果是不同的,为了能让卖家对衣服满意,我们需要对数据集进行训练和测试。

在scikit-learn中有train_test_split()函数,它可以将数据集进行拆分。其原理是将数据集进行随机排列,然后在默认情况下将其中75%归为训练数据集,另外25%归为测试数据集。下面根据数据和目标分类对数据进行拆分。

一般用大写X表示数据特征,用小写y表示数据标签。这是由于X是一个二维数组,y是一个一维数组或是向量。

#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#将数据集拆分为训练数据集和测试数据集
X_train, X_test, y_train, y_test = train_test_split(
    wine_dataset['data'], wine_dataset['target'], random_state=0
)

查看拆分后数据集的轮廓。可以看到训练数据集/测试数据集大约为3:1,且他们的特征变量都是13个。

在这里插入图片描述

(三)、使用K最近邻算法建模

#导入KNN分类模型
from sklearn.neighbors import KNeighborsClassifier
#指定模型数据点拟合邻近数为1
knn = KNeighborsClassifier(n_neighbors=1)
#对数据进行拟合
knn.fit(X_train, y_train)
#输出拟合方法
print(knn)

除了n_neighbors参数是我们指定的,其他参数都是默认值。
在这里插入图片描述

(四)、使用模型对新样本的分类进行预测

同样地,可以通过score()函数对模型测试数据集进行拟合并获取拟合分数。得分是0.76,对于代码搬运工的我来说结果不错(鼓掌:3)。

print("Dataset Score:{:.2f}".format(knn.score(X_test,y_test)))

在这里插入图片描述

接下来我们使用该模型对下列新数据进行分类预测。

features_names data
Alcohol 13.2
Malic Acid 2.77
Ash 2.51
Alcalinity of Ash 18.5
Magnesium 96.6
Total Phenols 1.04
Flavanoids 2.55
Nonflavanoid Phenols 0.57
Proanthocyanins 1.47
Colour Intensity 6.2
Hue 1.05
OD280/OD315 of diluted wines 3.33
Proline 820
#导入基础科学计算库
import numpy as np
#输入新数据点 13个数对应13个特征变量
X_new = np.array([[13.2,2.77,2.51,18.5,96.6,1.04,
                   2.55,0.57,1.47,6.2,1.05,3.33,820]])
#使用.predict进行预测
prediction = knn.predict(X_new)
print("Prediction Result",prediction)
print("Prediction Class of New Wine:{}".format(wine_dataset['target_names'][prediction]))

在这里插入图片描述
可以看到通过该模型,酒被分类到class_2。虽说模型准确率只有0.76,但这也是一个很好的开始啦!

当我们面对困难,不要害怕,勇敢地面对它,奥利给!٩(๑>◡<๑)۶

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!