独门秘籍,如何从零开始用Python实现感知算法?

全文共3494字,预计学习时长11分钟

独门秘籍,如何从零开始用Python实现感知算法?

来源:Pexels

这篇推文将展示如何使用python对乳腺癌数据集建立感知模型。

感知器是神经网络的基本单位。神经网络接收和处理加权输入,并对其进行二元分类。

免责声明:本文的内容和结构基于One-forth实验室——Padhai的深度学习讲座。

独门秘籍,如何从零开始用Python实现感知算法?

感知器概述

不同于MP神经元模型中的布尔输入,感知器模型中的输入可以是真正的数字。模型的输出仍然是二元的0或1。输入值x的加权和如果大于阈值b,感知模型将输出1,否则将输出0。

独门秘籍,如何从零开始用Python实现感知算法?

图1——数学表征学习算法

该学习算法的主要目的是找出能够把数据完全分成正P (y = 1)或负N(y = 0)的向量w,感知器学习算法运行如下。

独门秘籍,如何从零开始用Python实现感知算法?

图2——感知器算法

独门秘籍,如何从零开始用Python实现感知算法?

开始写代码吧

独门秘籍,如何从零开始用Python实现感知算法?

我们将使用来自于sklearn的乳腺癌数据集。数据集有569个观察值和30个变量(不包括类变量)。乳腺癌数据是失衡数据集,类别0和类别1的数据量差异较大。因为本例只是简单实现感知器模型,我们不打算采取任何抽样技术来平衡数据量。

独门秘籍,如何从零开始用Python实现感知算法?

(类失衡)

开始构建感知器模型之前,首先加载需要的包和数据集。数据集已经在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方法,找到最佳参数。我们将通过计算测试准确率来评估模型在测试数据上的性能。

独门秘籍,如何从零开始用Python实现感知算法?

更多改进

可以尝试一些改进来提高模型的准确性。

· 改变训练集和测试集的比例,观察模型预测准确率有无变化。

· 增加输入次数,学习速率,在感知器模型上测试,对准确率变化变化进行可视化处理。

· 在感知器模型中随机输入权值,测试其结果

独门秘籍,如何从零开始用Python实现感知算法?

来源:Pexels

独门秘籍,如何从零开始用Python实现感知算法?

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范