从负无穷学习机器学习(一)初识机器学习库

适逢双十一,买了一本名为《深入浅出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_namesdata
Alcohol13.2
Malic Acid2.77
Ash2.51
Alcalinity of Ash18.5
Magnesium96.6
Total Phenols1.04
Flavanoids2.55
Nonflavanoid Phenols0.57
Proanthocyanins1.47
Colour Intensity6.2
Hue1.05
OD280/OD315 of diluted wines3.33
Proline820
#导入基础科学计算库
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,但这也是一个很好的开始啦!

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值