4、简单的神经网络(MLP神经网络分类基础)

目录

1、神经网络:(Artifical Neural Network)

2、MLP简介

3、MLP方法

4、MLP简单的二分类代码案例


1、神经网络:(Artifical Neural Network)

全程为人工神经网络,是一种模仿生物神经网络(大脑)的结构和功能的数学模型或计算机模型

生物神经细胞;

神经细胞是构成神经系统的基本单元,称为生物神经元,简称神经元

# 简单神经网络

S型函数,单个神经元。

最简单的神经网络就是逻辑回归

# 二进制是生物学和计算机学的链接

# 神经网络的隐藏层不是越多越好,随着层数增多会达到一个阈值,再增加基本上不变,或者反而会减小。

2、MLP简介

MLP常常被用来做分类,每个输出对应一个不同的二进制分类(比如,垃圾邮件/正正常邮件,紧急/非紧急)

01 每个分类是在互斥的情况下爱,输出层通常被修改成一个共享的soft-max函数。

例如:图片数字的分类

3、MLP方法

sklearn.neural_network.MLPClassifier

MLPClassifier(solver=’sgd’, activation=’relu’,alpha=1e-4,

hidden_layer_sizes=(50,50), random_state=1,max_iter=10,verbose=10,learning_rate_init=.1)

参数说明: 
1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。 
2. activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relu 
- identity:f(x) = x 
- logistic:其实就是sigmod,f(x) = 1 / (1 + exp(-x)). 
- tanh:f(x) = tanh(x). 
- relu:f(x) = max(0, x) 
3. solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重 
- lbfgs:quasi-Newton方法的优化器 
- sgd:随机梯度下降 
- adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器 
注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。 
4. alpha :float,可选的,默认0.0001,正则化项参数 
5. batch_size : int , 可选的,默认’auto’,随机优化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch 
6. learning_rate :学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant 
- ‘constant’: 有’learning_rate_init’给定的恒定学习率 
- ‘incscaling’:随着时间t使用’power_t’的逆标度指数不断降低学习率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t) 
- ‘adaptive’:只要训练损耗在下降,就保持学习率为’learning_rate_init’不变,当连续两次不能降低训练损耗或验证分数停止升高至少tol时,将当前学习率除以5. 
 

此方法详细介绍见:https://blog.csdn.net/u011311291/article/details/78743393 

4、MLP简单的二分类代码案例

import pandas

data=pandas.read_csv('D:\\DATA\\pycase\\number2\\4.5\\Data.csv')

# 1 数据质量分析(缺失值、异常值、一致性分析)基本描述、检查空值

explore=data.describe()

# 此处为神经网络模型,数据量大,且有特征标签不好插值。顾进行删除

data=data.dropna()

data.shape

# 2 数据变换
# 对离散特征进行虚拟变量处理
# 分开定义变量为后续预测做铺垫,直接调用

dummyColumns=[
        'Gender', 'Home Ownership', 
    'Internet Connection', 'Marital Status',
    'Movie Selector', 'Prerec Format', 'TV Signal'
    ]
# 将逻辑变量进行类型转换

for column in dummyColumns: # 遍历选择的列进行类型转化
    data[column]=data[column].astype('category')
    
dummiesData=pandas.get_dummies(
        data, # 要处理的Dataframe
        columns=dummyColumns, # 要处理的列名,如果不指定该列,默认为处理所有的列 
        prefix_sep=" ",   # 前缀和离散值的分隔符,默认为下划线
        drop_first=True # 是否从备选项中删除第一个,建模的时候为避免共线性使用
        )

# 以性别为列,通过去重查看处理效果,查看某列属性的防范,两种,“。” 和[]

dummiesData['Gender Male'].unique()

data.Gender.unique()

data['Gender'].unique()

"""
博士后 post-Doc
博士   Doctorate
硕士   Master's Degree
学士   Bachelor's Degree
副学士    Associate's Degree
专业院校  Some College
职业学校  Trade School
高中      High School
小学      Grade School
"""

# 有大小离散特征值的转化

educationLevelDict={
        'Post-Doc':9,
        'Doctorate':8,
        'Master\'s Degree':7,# 在这里需要转义字符“\”
        'Bachelor\'s Degree': 6,
        'Associate\'s Degree': 5,
        'Some College': 4,
        'Trade School': 3,
        'High School': 2,
        'Grade School': 1
        }
# 增加数值列

dummiesData['Education Level Map']=dummiesData['Education Level'].map(educationLevelDict)

# 同理其他的可测量数值变量

freqMap = {
    'Never': 0,
    'Rarely': 1,
    'Monthly': 2,
    'Weekly': 3,
    'Daily': 4
}
dummiesData['PPV Freq Map'] = dummiesData['PPV Freq'].map(freqMap)
dummiesData['Theater Freq Map'] = dummiesData['Theater Freq'].map(freqMap)
dummiesData['TV Movie Freq Map'] = dummiesData['TV Movie Freq'].map(freqMap)
dummiesData['Prerec Buying Freq Map'] = dummiesData['Prerec Buying Freq'].map(freqMap)
dummiesData['Prerec Renting Freq Map'] = dummiesData['Prerec Renting Freq'].map(freqMap)
dummiesData['Prerec Viewing Freq Map'] = dummiesData['Prerec Viewing Freq'].map(freqMap)

dummiesData.columns

# 选取特征值

dummiesSelect = [
    'Age', 'Num Bathrooms', 'Num Bedrooms', 'Num Cars', 'Num Children', 'Num TVs', 
    'Education Level Map', 'PPV Freq Map', 'Theater Freq Map', 'TV Movie Freq Map', 
    'Prerec Buying Freq Map', 'Prerec Renting Freq Map', 'Prerec Viewing Freq Map', 
    'Gender Male',
    'Internet Connection DSL', 'Internet Connection Dial-Up', 
    'Internet Connection IDSN', 'Internet Connection No Internet Connection',
    'Internet Connection Other', 
    'Marital Status Married', 'Marital Status Never Married', 
    'Marital Status Other', 'Marital Status Separated', 
    'Movie Selector Me', 'Movie Selector Other', 'Movie Selector Spouse/Partner', 
    'Prerec Format DVD', 'Prerec Format Laserdisk', 'Prerec Format Other', 
    'Prerec Format VHS', 'Prerec Format Video CD', 
    'TV Signal Analog antennae', 'TV Signal Cable', 
    'TV Signal Digital Satellite', 'TV Signal Don\'t watch TV'
]

inputData = dummiesData[dummiesSelect]

# 选取结果值,有空值,需要[]

outputData=data.Gender

outputData=dummiesData['Home Ownership Rent']

# 导入神经网络的方法 

from sklearn.neural_network import MLPClassifier

for i in  range(1,11): # 遍历隐藏层从1到10
    ANNModel=MLPClassifier(
            activation='relu',  # 激活函数,类似S类型函数
            hidden_layer_sizes=i # 隐藏层越多,运算呈现几何级倍增,不是越多越好
            )
    ANNModel.fit(inputData,outputData)
    score=ANNModel.score(inputData,outputData)
    print(str(i)+","+str(score)) # 输出每个隐藏层对应的分数



# 导入新数据进行训练和测试

newData=pandas.read_csv('D:\\DATA\\pycase\\number2\\4.4\\newData.csv')
newData=newData.dropna()

# 将逻辑变量转化为虚拟变量,转换方式利用样本转化类型

for column in dummyColumns: 
    newData[column]=newData[column].astype(
            'category',
            categories=data[column].cat.categories
            )
    
# 依据样本字典进行新字段列的增加

newData['Education Level Map'] = newData['Education Level'].map(educationLevelDict)

newData['PPV Freq Map'] = newData['PPV Freq'].map(freqMap)
newData['Theater Freq Map'] = newData['Theater Freq'].map(freqMap)
newData['TV Movie Freq Map'] = newData['TV Movie Freq'].map(freqMap)
newData['Prerec Buying Freq Map'] = newData['Prerec Buying Freq'].map(freqMap)
newData['Prerec Renting Freq Map'] = newData['Prerec Renting Freq'].map(freqMap)
newData['Prerec Viewing Freq Map'] = newData['Prerec Viewing Freq'].map(freqMap)

    
    
    
dummiesNewData=pandas.get_dummies(
        newData,
        columns=dummyColumns,
        prefix=dummyColumns,# 列名的前缀,在多个列有相同离散项时候使用
        prefix_sep=" ",
        drop_first=True
        )



inputNewData=dummiesNewData[dummiesSelect]

ANNModel.predict(inputData)




 

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
神经网络中的MLP(Multilayer Perceptron)是一种常见的前馈神经网络模型,也是最为基础的人工神经网络之一。它是基于感知机模型的一种扩展,通过不断叠加多个隐层节点,将输入层的数据逐步提取特征并输出结果。 MLP采用的是一种被称为“前馈”的网络结构,即信息从输入层逐级传递到输出层的过程。MLP通常由三层组成:输入层、隐藏层和输出层。其中,输入层接收外部数据并将其传递给隐藏层,隐藏层按照一定的权值进行计算,最终将结果传递给输出层。 隐藏层是神经网络的核心部分,它通过权重和偏置的调整来进行学习和训练。当网络中的权重和偏置参数达到一定程度时,网络会对输入数据具有一定的分类和判断能力。 MLP的基本结构包括神经元、权重、偏置和激活函数。神经元是神经网络中的最基本单元,输入的数据首先与神经元的权重进行加权求和,再加上偏置,经过激活函数处理后得到神经元的输出。激活函数则将经过加权和偏置之后的输出转化为一个非线性的响应,从而实现信息的非线性传递。 MLP的优势在于其强大的非线性映射能力,能够在大量的数据中找到隐藏的规律并作出预测。同时,MLP还具有很好的可扩展性和稳定性,其模型结构可以根据实际需要自由调整。 然而,MLP在实践中也存在一些问。例如,MLP网络对初始参数的依赖性很强,需要对其进行良好的初始化才能取得好的效果。此外,为避免过拟合的发生,MLP的训练过程需要采用dropout、正则化等技术。 在深度学习的发展中,MLP已被许多新的神经网络结构所代替,但无论如何,MLP作为人工神经网络中的重要一环,其基础理论和实现方法对于理解神经网络的发展历程以及应用的研究具有重要的意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值