关于感知机算法的原理,数学推导,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
将数据存储到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)
w = perceptron.coef_[0]
b = perceptron.intercept_
画出拟合好的图形,观察是否正确分类
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(df['sepal_length'], (w[0]*df['sepal_length'] + b)/(-w[1]))
plt.legend(loc = 'best')
结果如下: 谢谢阅读,欢迎大家多多进行交流或指出问题。
|