目录
1 数据构建
1.1 熟悉要处理的数据
1.2 查看数据
1.3 构建自己的数据
1.4 测试数据分割
2 k近邻分类
2.1 k近邻算法
2.2 数据模型优良评判
3 sklearn数据集
3.1 鸢尾花数据集
3.2 k近邻分类算法的应用
1 数据构建
10kV架空路线中,单相接地故障是一种常见的故障。对此类故障和线路运行状态,由实际采集系统中所采集的数据构建了21条表征线路运行状态和故障状态的数据集。
1.1 熟悉要处理的数据
打开Spyder,输入以下程序:
ground_feature.csv文件获取:
链接:https://pan.baidu.com/s/1sNz3RqyiAU7V8djcXVPOtA
提取码:whj6
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
gf = pd.read_csv('E:PYTHONground_feature.csv')
data = gf.values
print('Keys of ground feature:n{}'.format(gf.columns))
运行结果如下:
Keys of ground feature:
Index(['Drop percentage', 'tAscending mutation value',
'tWavelet lifting mutation value', 'ttarget'],
dtype='object')
由运行结果可见,该数据有4个字段,分别为Drop percentage、Ascending mutation value、Wavelet lifting mutation value、target,分别表示电场下降百分比、电流上升突变值、电流小波提升突变值、目标。
程序运行界面如下图所示:
也可以在控制台窗口中输入该程序,但语句量较多的情况下不建议该操作:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
gf = pd.read_csv('E:PYTHONground_feature.csv')
data = gf.values
print('Keys of ground feature:n{}'.format(gf.columns))
Keys of ground feature:
Index(['Drop percentage', 'tAscending mutation value',
'tWavelet lifting mutation value', 'ttarget'],
dtype='object')
1.2 查看数据
在控制台窗口中输入以下语句:
print('Data of ground feature:n{}'.format(gf.values))
运行结果如下:
Data of ground feature: [[ 0.89 11.4 13.5 1. ] [ 0.89 0.4 0.5 0. ] [ 0.75 8.6 14.6 1. ] [ 0.23 4.3 7.2 0. ] [ 0.5 3.2 8.4 1. ] [ 0.49 0.7 1.2 0. ] [ 0.29 2.2 3.6 0. ] [ 0.31 3.5 5.6 0. ] [ 0.95 10.9 18.5 1. ] [ 0.93 5.6 12.5 1. ] [ 0.82 7.8 16.2 1. ] [ 0.82 0.9 1.6 0. ] [ 0.15 3.3 7.6 0. ] [ 0.43 0.5 1.7 0. ] [ 0.55 2.9 4.6 1. ] [ 0.55 -0.5 1.2 0. ] [ 0.78 6.9 15.6 1. ] [ 0.76 0.8 1.2 0. ] [ 0.88 10.5 20.3 1. ] [ 0.88 0.3 0.6 0. ] [ 0.67 5.9 13.4 1. ]]
运行界面如下图:
1.3 构建自己的数据
在Spyder控制台窗口中输入以下语句:
import pandas as pd
gf = pd.read_csv('E:PYTHONground_feature.csv')
data = gf.values
data
运行结果如下:
array([[ 0.89, 11.4 , 13.5 , 1. ],
[ 0.89, 0.4 , 0.5 , 0. ],
[ 0.75, 8.6 , 14.6 , 1. ],
[ 0.23, 4.3 , 7.2 , 0. ],
[ 0.5 , 3.2 , 8.4 , 1. ],
[ 0.49, 0.7 , 1.2 , 0. ],
[ 0.29, 2.2 , 3.6 , 0. ],
[ 0.31, 3.5 , 5.6 , 0. ],
[ 0.95, 10.9 , 18.5 , 1. ],
[ 0.93, 5.6 , 12.5 , 1. ],
[ 0.82, 7.8 , 16.2 , 1. ],
[ 0.82, 0.9 , 1.6 , 0. ],
[ 0.15, 3.3 , 7.6 , 0. ],
[ 0.43, 0.5 , 1.7 , 0. ],
[ 0.55, 2.9 , 4.6 , 1. ],
[ 0.55, -0.5 , 1.2 , 0. ],
[ 0.78, 6.9 , 15.6 , 1. ],
[ 0.76, 0.8 , 1.2 , 0. ],
[ 0.88, 10.5 , 20.3 , 1. ],
[ 0.88, 0.3 , 0.6 , 0. ],
[ 0.67, 5.9 , 13.4 , 1. ]])
运行界面如下图:
如果在程序编辑窗口运行,需要输入以下语句:
import pandas as pd
gf = pd.read_csv('E:PYTHONground_feature.csv')
data = gf.values
print(data)
运行结果如下:
[[ 0.89 11.4 13.5 1. ] [ 0.89 0.4 0.5 0. ] [ 0.75 8.6 14.6 1. ] [ 0.23 4.3 7.2 0. ] [ 0.5 3.2 8.4 1. ] [ 0.49 0.7 1.2 0. ] [ 0.29 2.2 3.6 0. ] [ 0.31 3.5 5.6 0. ] [ 0.95 10.9 18.5 1. ] [ 0.93 5.6 12.5 1. ] [ 0.82 7.8 16.2 1. ] [ 0.82 0.9 1.6 0. ] [ 0.15 3.3 7.6 0. ] [ 0.43 0.5 1.7 0. ] [ 0.55 2.9 4.6 1. ] [ 0.55 -0.5 1.2 0. ] [ 0.78 6.9 15.6 1. ] [ 0.76 0.8 1.2 0. ] [ 0.88 10.5 20.3 1. ] [ 0.88 0.3 0.6 0. ] [ 0.67 5.9 13.4 1. ]]
运行界面如下图:
下面的程序段可以完全显示自己构造的数据格式:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
gf = pd.read_csv('E:PYTHONground_feature.csv')
print('Keys of ground feature:n{}'.format(gf.columns))
print('Keys of ground feature:n{}'.format(gf.values))
运行结果如下:
Keys of ground feature:
Index(['Drop percentage', 'tAscending mutation value',
'tWavelet lifting mutation value', 'ttarget'],
dtype='object')
Keys of ground feature:
[[ 0.89 11.4 13.5 1. ]
[ 0.89 0.4 0.5 0. ]
[ 0.75 8.6 14.6 1. ]
[ 0.23 4.3 7.2 0. ]
[ 0.5 3.2 8.4 1. ]
[ 0.49 0.7 1.2 0. ]
[ 0.29 2.2 3.6 0. ]
[ 0.31 3.5 5.6 0. ]
[ 0.95 10.9 18.5 1. ]
[ 0.93 5.6 12.5 1. ]
[ 0.82 7.8 16.2 1. ]
[ 0.82 0.9 1.6 0. ]
[ 0.15 3.3 7.6 0. ]
[ 0.43 0.5 1.7 0. ]
[ 0.55 2.9 4.6 1. ]
[ 0.55 -0.5 1.2 0. ]
[ 0.78 6.9 15.6 1. ]
[ 0.76 0.8 1.2 0. ]
[ 0.88 10.5 20.3 1. ]
[ 0.88 0.3 0.6 0. ]
[ 0.67 5.9 13.4 1. ]]
运行界面如下图:
1.4 测试数据分割
一般情况下,需要将所采集到的数据分成两部分:一部分用于训练,一部分用于测试。sklearn包中的train_test_split()函数可以将数据集打乱并进行拆分。该函数默认将75%的数据及其对应的目标结果作为训练数据集,25%的数据集及对应的目标结果作为测试数据集。 训练数据集和测试数据集的数据比例可以通过test_size参数进行控制,该参数在0.0~1.0取值。一般用X表示数据集,y来表示所对应的目标结果。
在程序编辑窗口运行,输入以下语句:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
df1 = pd.read_csv('E:PYTHONground_feature.csv')
data = df1.values
X = data[:,0:3] #构建要分割的数据
y = data[:,3] #构建分类目标
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
运行后控制台显示:
runfile('E:/PYTHON/spyder/meacine1.py', wdir='E:/PYTHON/spyder')
在控制台窗口中输入以下语句:
print('X_train shape:{}'.format(X_train.shape))
print('X_test shape:{}'.format(X_test.shape))
print('y_train shape:{}'.format(y_train.shape))
print('y_test shape:{}'.format(y_test.shape))
运行结果如下:
X_train shape:(15, 3) X_test shape:(6, 3) y_train shape:(15,) y_test shape:(6,)
运行界面如下图:
2 k近邻分类
2.1 k近邻算法
k近邻(K-Nearest Neighbor, KNN)分类算法的基本思路是新样本与最近的邻居类别归为一类。如果邻居个数是多个,则按最多的邻居个数归类。
在个已知样本中,找出的个近邻可以这样描述:设在个样本中,来自类的样本有个,来自类的样本有个......来自类的样本有个,若分别是个近邻中属于类的样本数,则定义判别函数为:
若决策规则为:
则决策。
k近邻分类算法在sklearn包中的neighbors模块中的KNeighborsClassifier类中实现。在使用中,KNeighborsClassifier类要赋给一个变量实现,参数是邻居的个数。
下面将对单相接地故障或非接地故障数据进行分类,并利用新数据进行预测。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
gf = pd.read_csv('E:PYTHONground_feature.csv')
data = gf.values
X = data[:,0:3] #构建要分割的数据
y = data[:,3] #构建分类目标
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=4)
gf_knn = KNeighborsClassifier(n_neighbors=1)
gf_knn.fit(X_train,y_train)
gf_new = np.array([[0.17,3.1,5.6]]) #构建一个非接地故障向量
gf_prediction = gf_knn.predict(gf_new) #对新向量进行预测
print(gf_prediction)
运行结果如下:
runfile('E:/PYTHON/spyder/meacine1.py', wdir='E:/PYTHON/spyder')
[0.]
运行界面如下图:
本例的预测结果将新数据划归为非接地故障,结果符合预期。0代表非接地。利用KNeighborsClassifier()函数创造对象gf_knn,利用fit()函数进行计算,利用gf_knn.predict()函数进行预测。本例构建的非接地故障向量被k近邻分类算法正确地归类到非接地空间中。
2.2 数据模型优良评判
一般情况下,可以通过测试集中的数据对模型进行输出预测,并将结果与已知的目标结果进行比较。预测结果的正确率越高,模型的可靠性越高。
计算预测结果正确率可以用以下语句实现:
gf_pred = gf_knn.predict(X_test)
print('Test set score :{:.2f}'.format(np.mean(gf_pred==y_test)))
运行结果如下:
Test set score :0.83
运行界面如下图:
还可以使用score()函数直接求取模型得分:
print(gf_knn.score(X_test,y_test))
运行结果如下:
0.8333333333333334
运行界面如下图:
3 sklearn数据集
读者可以通过"import sklearn.datasets.load_name"语句获取sklearn自带数据集。
| 数据集 | 说明 |
| load_iris() | 鸢尾花数据集,用于分类任务的数据集。 |
| load_digits() | 手写数据集,用于分类任务或降维任务的数据集。 |
| load_barest_cancer() | 乳腺癌数据集,简单经典的用于二分类任务的数据集。 |
| load_diabetes() | 糖尿病数据集,用于回归分析的数据集。 |
| load_boston() | 波士顿房价数据集,经典的用于回归任务的数据集。 |
| load_linnerud() | 体能训练数据集,经典的用于多变量回归任务的数据集。 |
3.1 鸢尾花数据集
首先在Pycharm或者Spyder中输入以下语句:
from prometheus_client import samples
from sklearn.datasets import load_iris
iris = load_iris()
samples,features = iris.data.shape
print('鸢尾花数据集中共有{0}个样本,每个样本中包含{1}个特征'.format(samples,features))
print('每个特征所代表的的实际含义:n',iris.feature_names)
print('每种鸢尾花的名字:n',iris.target_names)
print('前20条数据:n',iris.data[:20])
运行结果如下:
鸢尾花数据集中共有150个样本,每个样本中包含4个特征 每个特征所代表的的实际含义: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 每种鸢尾花的名字: ['setosa' 'versicolor' 'virginica'] 前20条数据: [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3] [5. 3.4 1.5 0.2] [4.4 2.9 1.4 0.2] [4.9 3.1 1.5 0.1] [5.4 3.7 1.5 0.2] [4.8 3.4 1.6 0.2] [4.8 3. 1.4 0.1] [4.3 3. 1.1 0.1] [5.8 4. 1.2 0.2] [5.7 4.4 1.5 0.4] [5.4 3.9 1.3 0.4] [5.1 3.5 1.4 0.3] [5.7 3.8 1.7 0.3] [5.1 3.8 1.5 0.3]]
运行界面如下图:
3.2 k近邻分类算法的应用
采用k近邻分类算法对鸢尾花数据集进行分类预测:
import numpy as np
import pandas as pd
import mglearn
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
#调用load_iris()函数,加载数据
iris = load_iris()
#构建数据
X_train,X_test,y_train,y_test = train_test_split(iris['data'],iris['target'],random_state=0)
#绘制散点图矩阵,对角线是每个特征的直方图
iris_dataframe = pd.DataFrame(X_train,columns=iris.feature_names)
grr = pd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},cmap=mglearn.cm3)
plt.show()
#构建k近邻分类模型
iris_knn = KNeighborsClassifier(n_neighbors=1)
iris_knn.fit(X_train,y_train)
#构建新的预测数据
X_new = np.array([[4.9,2.9,1.2,0.2]])
#预测结果并输出
prediction = iris_knn.predict(X_new)
print('Prediction:{}'.format(prediction))
print('Predicted target name:{}'.format(iris['target_names'][prediction]))
#模型评估
print('score:{:2f}'.format(iris_knn.score(X_test,y_test)))
运行结果如下:
Prediction:[0] Predicted target name:['setosa'] score:0.973684
笔记摘自:《Python机器学习教程》——顾涛



