sklearn.linear_model.Perceptron感知机模型参数、属性解释及实操


关于感知机算法的原理,数学推导,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_interceptbool值,默认=True是否对参数 截距项b进行估计,若为False则数据应是中心化的
max_iterint整数,默认=1000最大迭代次数,哪怕损失函数依旧大于0
tolfloat or None,默认=10^(-3)迭代停止的标准。如果不为None,那么当loss-pre-loss<tol的时候,就会停止迭代。因为当前迭代造成的损失函数下降太小了,迭代下去对loss影响不大了。
shufflebool值,默认=True每轮训练后是否打乱数据
verbose取值为整数,默认=0verbose = 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')

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

  • 10
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值