独门秘籍,如何从零开始用Python实现感知算法?
全文共3494字,预计学习时长11分钟
来源:Pexels
这篇推文将展示如何使用python对乳腺癌数据集建立感知模型。
感知器是神经网络的基本单位。神经网络接收和处理加权输入,并对其进行二元分类。
免责声明:本文的内容和结构基于One-forth实验室——Padhai的深度学习讲座。
感知器概述
不同于MP神经元模型中的布尔输入,感知器模型中的输入可以是真正的数字。模型的输出仍然是二元的0或1。输入值x的加权和如果大于阈值b,感知模型将输出1,否则将输出0。
图1——数学表征学习算法
该学习算法的主要目的是找出能够把数据完全分成正P (y = 1)或负N(y = 0)的向量w,感知器学习算法运行如下。
图2——感知器算法
开始写代码吧
我们将使用来自于sklearn的乳腺癌数据集。数据集有569个观察值和30个变量(不包括类变量)。乳腺癌数据是失衡数据集,类别0和类别1的数据量差异较大。因为本例只是简单实现感知器模型,我们不打算采取任何抽样技术来平衡数据量。
(类失衡)
开始构建感知器模型之前,首先加载需要的包和数据集。数据集已经在sklearn的数据模块中准备就绪。数据加载完成后,需要使用breast_cancer.data和breast_cancer.target命令提取数据特征和反应变量。
#import packages
import sklearn.datasets
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
#load thebreast cancer data
breast_cancer= sklearn.datasets.load_breast_cancer()
#convertthe data to pandas dataframe.
data =pd.DataFrame(breast_cancer.data, columns = breast_cancer.feature_names)
data["class"] = breast_cancer.target
data.head()
data.describe()
#plottinga graph to see classimbalance
data['class'].value_counts().plot(kind = "barh")
plt.xlabel("Count")
plt.ylabel("Classes")
plt.show()
from sklearn.preprocessing import MinMaxScaler
#performscaling on the data.
X =data.drop("class", axis = 1)
Y = data["class"]
mnscaler =MinMaxScaler()
X = mnscaler.fit_transform(X)
X =pd.DataFrame(X, columns=data.drop("class",axis = 1).columns)
#traintest split.
X_train,X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.1, stratify= Y, random_state = 1)
(感知器预处理)
获取变量X和Y后,通过最小最大缩放将所有的特征值控制在范围0~1内。建立模型前,将数据分割为训练用数据和测试用数据,分别对两部分数据进行模型训练与性能测试。我们将使用sklearn的train_test_split函数将数据按90:10的比例进行分割,分别用于训练和测试。现在预处理已经完成,可以开始构建模型了。我们将在一个叫做perceptron的类中构建模型。
在“perceptron”类中,编写一个构造函数def_init_。这一函数将权值向量w与阈值b设置为空。
classPerceptron:
#constructor
def__init__ (self):
self.w = None
self.b = None
#model
def model(self, x):
return1if (np.dot(self.w, x) >= self.b) else0
#predictor to predict on the data based on w
def predict(self, X):
Y = []
for x in X:
result = self.model(x)
Y.append(result)
return np.array(Y)
def fit(self, X, Y, epochs = 1, lr = 1):
self.w = np.ones(X.shape[1])
self.b = 0
accuracy = {}
max_accuracy = 0
wt_matrix = []
#for all epochs
for i in range(epochs):
for x, y in zip(X,Y):
y_pred = self.model(x)
if y == 1 andy_pred == 0:
self.w = self.w + lr * x
self.b = self.b - lr * 1
elif y == 0 andy_pred == 1:
self.w = self.w - lr * x
self.b = self.b + lr * 1
wt_matrix.append(self.w)
accuracy[i] =accuracy_score(self.predict(X), Y)
if (accuracy[i] > max_accuracy):
max_accuracy = accuracy[i]
chkptw = self.w
chkptb = self.b
#checkpoint (Save the weights and b value)
self.w = chkptw
self.b = chkptb
print(max_accuracy)
#plot the accuracy values over epochs
plt.plot(accuracy.values())
plt.xlabel("Epoch #")
plt.ylabel("Accuracy")
plt.ylim([0, 1])
plt.show()
#return the weight matrix, that contains weightsover all epochs
return np.array(wt_matrix)
(perceptron模型)
函数模型以输入值x作为参数,计算输入的加权聚合(w与x的点积),点积大于b则返回值为1,否则返回值为0。接下来调用predict函数,其参数为x,该函数计算x中每一个观察值的预测结果,并返回预测结果列表。
最后,执行fit函数找到为给定数据分类的最佳权值向量w和阈值b。该函数以输入数据(x与y),学习率和训练次数作为参数。
perceptron= Perceptron()
#epochs = 10000 and lr = 0.3
wt_matrix= perceptron.fit(X_train, Y_train, 10000, 0.3)
#makingpredictions on test data
Y_pred_test= perceptron.predict(X_test)
#checkingthe accuracy of the model
print(accuracy_score(Y_pred_test,Y_test))
(perceptron模型的执行)
搭建好这个类之后,将新的perceptron类初始化,使用该类对训练用数据调用fit方法,找到最佳参数。我们将通过计算测试准确率来评估模型在测试数据上的性能。
更多改进
可以尝试一些改进来提高模型的准确性。
· 改变训练集和测试集的比例,观察模型预测准确率有无变化。
· 增加输入次数,学习速率,在感知器模型上测试,对准确率变化变化进行可视化处理。
· 在感知器模型中随机输入权值,测试其结果
来源:Pexels
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范