适逢双十一,买了一本名为《深入浅出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']))
可以看到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,但这也是一个很好的开始啦!
当我们面对困难,不要害怕,勇敢地面对它,奥利给!٩(๑>◡<๑)۶
来源:CSDN
作者:SeanOY
链接:https://blog.csdn.net/qq_33194301/article/details/103536463