可视化:将读入的数据用matlab库画出来

导入所需要的库import matplotlib.pyplot as plt

        1.读入数据

data = np.loadtxt("D:\pythoncode\Sklearn_code\sklearn\datingTestSet2.txt")

        2.划分数据

其中data[:,-1]是数据的切片,表示取出最后一列的所有行,即获取标签数据,data[data[:,-1] == 1]表示取标签值等于一的所有行。

# 获取最后一列标签数据为1的数据
data1 = data[data[:,-1] == 1]

# 获取最后一列标签数据为2的数据
data2 = data[data[:,-1] == 2]

# 获取最后一列标签数据为3的数据
data3 = data[data[:,-1] == 3]

        3.设置画布

fig = plt.figure()  #设置画布

ax = plt.axes(projection = "3d") # 表示升到三维。

# 画图
fig = plt.figure()
ax = plt.axes(projection = "3d")

        4.画散点图

ax.scatter() # 表示要画散点图,里面的参数按照位置传参分别代表了x值,y值,z值,关键字传参中c表示color,要么直接输入颜色的英文,要么输入颜色对应的16进制,marker参数表示画图时数据的形状o,^,+,* ......

# 画散点图
ax.scatter(data1[:,0],data1[:,1],data1[:,2],c = "#00DDAA", marker="o")
ax.scatter(data2[:,0],data2[:,1],data2[:,2],c = "red", marker="^")
ax.scatter(data3[:,0],data3[:,1],data3[:,2],c = "yellow", marker="+")

ax.set(xlabel = "Xaxes",ylabel = "Yaxes",zlabel = "Zaxes")
plt.show()

         5.效果图

K近邻算法(K-Nearest Neighborst):逻辑核心即近朱者赤,近墨者黑

主要分为两种问题

        1.分类问题:要给新来的一个样本数据分类,看他周围最近的k个已知样本数据,哪个类别数量多,新样本就分到哪一类。

        2.回归问题:新样本的值 = 这K个邻居的平均值

那么这么多的样本数据怎么找到最近的K个数据呢? 是用两点之间的距离来决定的,K近邻就是指离新样本距离最近的k个数据,欧氏距离公式

                                               d = \sqrt{(x-x_{1})^2+(y-y_{1})^2}

具体实例:鸢尾花测试

导入numpy,pandas,sklearn里的KNeighborsClassifier分类器

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier

加载鸢尾花训练和测试数据集

tran_data = pd.read_excel("D:\pythoncode\Sklearn_code\sklearn\鸢尾花训练数据.xlsx")
test_data = pd.read_excel("D:\pythoncode\Sklearn_code\sklearn\鸢尾花测试数据.xlsx")

分离数据与标签

# 数据处理,分离数据与标签
tran_data_X = tran_data[["样本","萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]]
tran_data_y = tran_data["类型_num"]

test_data_X = test_data[["样本","萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]]
test_data_y = test_data["类型_num"]

数据标准化

# 数据标准化
from sklearn.preprocessing import scale
data_tran_X = pd.DataFrame()
data_tran_X["萼片长标准化"] = scale(tran_data_X["萼片长(cm)"])
data_tran_X["萼片宽标准化"] = scale(tran_data_X["萼片宽(cm)"])
data_tran_X["花瓣长标准化"] = scale(tran_data_X["花瓣长(cm)"])
data_tran_X["花瓣宽标准化"] = scale(tran_data_X["花瓣宽(cm)"])

data_test_X = pd.DataFrame()
data_test_X["萼片长标准化"] = scale(test_data_X["萼片长(cm)"])
data_test_X["萼片宽标准化"] = scale(test_data_X["萼片宽(cm)"])
data_test_X["花瓣长标准化"] = scale(test_data_X["花瓣长(cm)"])
data_test_X["花瓣宽标准化"] = scale(test_data_X["花瓣宽(cm)"])

数据标准化是非常有必要的,因为各个数据的单位都不一样,这样会导致数据里有的列的值非常大,有的列的值非常小,在计算欧式距离时,数值大的则会占巨大权重,这样算出来的距离主要都由数值大的特征决定,非常不合理。因此需要用标准化,这里使用的是Z-score标准化,公式:

                                                 \sigma = \sqrt{[ \sum(x_{i}-\mu)^2 ]/N}

                                                  z = \frac{x-\mu}{\sigma }

x:原始特征值

\mu:该特征在整个样本上的均值

\sigma:该特征在整个样本上的标准差

处理后的结果:数据的均值变为 0,标准差变为 1。数据不再带有单位(无量纲化),只表示相对位置。

创建knn,参数n_neighbors=15表示找最近的15个邻居,默认参数是5。使用KNeighborsClassifier里面的fit方法训练数据,参数需要数据集和标签。

knn = KNeighborsClassifier(n_neighbors=14)
knn.fit(data_tran_X,tran_data_y)

自预测,判断训练好的模型的性能

# 自预测
tran_predict = knn.predict(data_tran_X)
score = knn.score(data_tran_X,tran_data_y)
print("自预测的分数是:",score)

用测试集预测

# 使用测试集预测
test_predict = knn.predict(data_test_X)
score_test = knn.score(data_test_X,test_data_y)
print("测试集的准确率为:",score_test)

更多推荐