关于感知机算法的原理,数学推导,python手动实现可以查看本人的这篇文章

1. sklearn.linear_model.Perceptron参数解释

用于创建感知机模型时传递的参数。

参数名称 参数取值 参数解释
penalty 默认=None,即不加惩罚项,‘l2’(L2正则) or ‘l1’(L1正则) or ‘elasticnet’(混合正则) 惩罚项,加上惩罚项主要为了避免模型过拟合风险
alpha 默认=0.0001,取值为浮点数 如果penalty不为None,则正则化项需要乘上这个数
l1_ratio 默认=0.15,取值在[0,1] 一般只在penalty=elasticnet时用,当l1_ratio =0就是L2正则,当l1_ratio =1就是L1正则,当在(0,1)之间就是混合正则
fit_intercept bool值,默认=True 是否对参数 截距项b进行估计,若为False则数据应是中心化的
max_iter int整数,默认=1000 最大迭代次数,哪怕损失函数依旧大于0
tol float or None,默认=10^(-3) 迭代停止的标准。如果不为None,那么当loss-pre-loss<tol的时候,就会停止迭代。因为当前迭代造成的损失函数下降太小了,迭代下去对loss影响不大了。
shuffle bool值,默认=True 每轮训练后是否打乱数据
verbose 取值为整数,默认=0 verbose = 0 为不在标准输出流输出日志信息,verbose = 1 为输出进度条记录;verbose = 2 为每个epoch输出一行记录
eta0 取值双精度浮点型double,默认=1 学习率,决定梯度下降时每次参数变化的幅度
n_jobs 取值为 int or None,默认=None 在多分类时使用的CPU数量,默认为None(或1),若为-1则使用所有CPU
random_state 取值为int, RandomState instance or None,默认=None 当 shuffle =True时,用于打乱训练数据
n_iter_no_change 取值int,默认=5 在提前停止之前等待验证分数无改进的迭代次数,用于提前停止迭代
early_stopping 取值bool值,默认=False 当验证得分不再提高时是否设置提前停止来终止训练。若设置此项,当验证得分在n_iter_no_change轮内没有提升时提前停止训练
class_weight 取值为dict, {class_label: weight} 或者 “balanced”或者None,默认=None 用于拟合参数时,每一类的权重是多少。当为None时,所有类的权重为1,等权重;当为balanced时,某类的权重为该类频数的反比,当为字典时,则key为类的标签,值为对应的权重
warm_start 取值为bool,默认=False 若为True则调用前一次设置的参数,使用新设置的参数

2. sklearn.linear_model.Perceptron属性解释

属性名称 属性的类型 属性解释
classes_ array 一维数组,shape=(k,) ,k为y的类别数量 放着y所有分类的数组,如感知机是array([-1., 1.])
coef_ array 二维数组 输出训练后的模型参数w的数组,不包含截距项b。当为二分类时,该数组shape=(1,n),n为特征数量。当为多分类时shape=(k, n)
intercept_ array 一维数组 输出训练后的模型截距b的数组。当为二分类时,该数组shape=(1,)。当为多分类时shape=(k, )
loss_function_ 损失函数的类别 即用的哪种损失函数来定义模型输出值与真实值之间的差异
n_iter_ 整数 即模型停止时共迭代的次数
t_ 整数 模型训练时,权重w更新的总次数,等于n_iter_*样本数量

3. sklearn.linear_model.Perceptron实战

这里选取sklearn内置数据库的iris(鸢尾属植物)数据集进行实战演练。

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris 
import matplotlib.pyplot as plt
from sklearn.linear_model import Perceptron
# %matplotlib notebook

将数据存储到dataframe中:

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df

结果如下:
在这里插入图片描述
总共有4个特征——sepal花萼的长宽以及petal花瓣的长宽,但是为了更直观的观察数据,这里只取花萼的长宽这两个特征进行这次练习,并且感知机是二分类模型,所以只选取前100行(只包含0、1两类)。

df = df.iloc[:100, [0, 1, -1]]
df.columns = ['sepal_length', 'sepal_width', 'label']
df

结果如下:
在这里插入图片描述
画出图形:

plt.figure()
plt.scatter(df.iloc[:50, 0], df.iloc[:50,1], label='0')
plt.scatter(df.iloc[50:100, 0], df.iloc[50:100,1], label='1')
plt.xlabel('sepal_length')
plt.ylabel('sepal_width')
plt.legend()

在这里插入图片描述
直观上感觉是线性可分的。提取出特征与输出值,将标签0改为-1。

data = np.array(df)
X, y = data[:,:-1], data[:,-1]
y[y==0] = -1

使用sklearn.linear_model.Perceptron创建感知机模型,并求出参数

from sklearn.linear_model import Perceptron
perceptron = Perceptron(fit_intercept=True, max_iter=1000, shuffle=True)
perceptron.fit(X, y)  # 默认学习率为1
w = perceptron.coef_[0]  # ,注意输出的是二维数组,加上[0]后, w=[ 23.2 -38.7]
b = perceptron.intercept_  # b=-5

画出拟合好的图形,观察是否正确分类

fig = plt.figure()
x_ticks = np.linspace(4.3,7,10)
ax = plt.subplot(1,1,1)
ax.set_xticks(x_ticks)
ax.set_xlim(4.2,7.1)
ax.set_ylim(1.9,4.5)
ax.set_xlabel('sepal_length')
ax.set_ylabel('sepal_width')
plt.scatter(df.iloc[:50, 0], df.iloc[:50,1], label='0')
plt.scatter(df.iloc[50:100, 0], df.iloc[50:100,1], label='1')
plt.plot(x_ticks, (w[0]*x_ticks + b)/(-w[1]))
plt.legend(loc = 'best')

结果如下:
在这里插入图片描述
谢谢阅读,欢迎大家多多进行交流或指出问题。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐