首页 > 编程知识 正文

神经网络简述,一个典型的神经网络包括

时间:2023-05-03 23:44:15 阅读:189123 作者:2611

目录

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 pandasdata=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.GenderoutputData=dummiesData['Home Ownership Rent']# 导入神经网络的方法 from sklearn.neural_network import MLPClassifierfor 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)

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。