大师兄的数据分析学习笔记(二十二):逻辑回归(Logistic Regression)
大师兄的数据分析学习笔记(二十四):回归树与提升树
一、 关于分类和回归
- 分类和回归的界限并不大:
- 分类可以看做是有限状态的回归。
- 回归可以看做是无限定序数据的分类。
- 很多模型都是可以在分类和回归中互相借鉴使用,只是在细节处理上需要特殊对待,比如人工神经网络。
- 在监督学习中,所谓分类和回归的目的,可以理解成以下过程:
- 给定一些特征和特征的标注,整理他们的特征、标注和连续值。
- 当一个未知数据进入时,让新数据的特征,和整理好的被给定的数据特征中最相似的数据特征保持一致的分类,或保持相近的连续值。
- 也就是说让测试集和验证集的数据,尽可能的找到训练集中与他们相近的标注,作为他们的标注。
- 如何近似的标注不止一个,可以用投票或者取平均值的方式决定最终的值,这就是分类和回归
-
分类和回归中最简单的模型是线性模型,只是分类是线性模型的特殊情况(回归的值只有0和1),且分类效果容易受到离群值和异常值的影响。
- 而逻辑回归模型解决了线性模型的问题,更有一个分类器的样子。
二、感知器
- 如果从结构化的思维理解模型,线性回归表达式如下:
- 其中最左侧是数据的特征。
- 实线表示系数。
- 特征与值相乘的和SUM为最终值,用来判断类别。
- 图的左侧为线性判别器。
-
如果最终值SUM不用来直接比较,而是通过一个逻辑函数:
- 如果函数f是逻辑函数sigmoid,则模型变为逻辑回归:。
- 由于这个结构像是一个感知的单元,通过对特征的感知来做出判断,所以这样的组件被叫做感知器。
- 通过公式可以看出,如果是单调的,则感知器必然是以线性模型为基础的单调模型。
- 如果g是非单调的,则感知器会过于复杂,对之后的模块有过大的耦合和不确定性。
- 为了解决上面的问题,可以将感知器进行并联,如果多个感知器的输出可以被当做特征进入下一级神经元,通过多级的线性变换嵌套,可以实现高阶变换,也就是非线性变换。
- 如果感知器拥有了非线性映射的能力,对复杂数据的分类就会变得简单。
三、人工神经网络
- 如果纳入更多的感知器,一级一级的连起来,就构成了人工神经网络。
- 图中的线代表的都是参数,且这些参数都是相互独立的。
- 每个节点都是将参数与属性相乘的和进行转换的过程,也就是感知器。
-
人工神经网络通常是按照层级结构进行排序的,分为输入层、隐含层和输出层:
- 输入层要求对全部的特征进行归一化。
- 输出层要求为one-hot形式。
- 隐含层输入与输出进行非线性变换的重要一层,其中对收敛影响较大的是节点中的转换函数f,被称为激活函数,比如逻辑回归中的sigmoid。
- 神经网络中所有参数都要被求出来,可以通过梯度下降法求解。
- 但神经网络为了保证非线性,规模会非常大,参数也会非常多,所以通常会通过反向传播算法和随机梯度下降法求解。
- 反向传播算法的思路分为四步:
- 前向计算:当参数被确定后,都会被附上随机值,然后先把特征都输入,然后进行计算。
- 计算误差:计算结果和拟合值得误差。
- 反向单层调整:根据误差,用梯度下降法调整输出层和隐含层之间一层的系数。
- 传播:调整隐含层和输入层之间的误差。
之后不断迭代上面的过程,不断地输入数据,直到模型的误差达到一定范围以内/迭代或一定次数后,则被认为收敛。
- 随机梯度下降法就是在每次调整权值时,只选取部分样本进行梯度下降。
- 优点:收敛更快,计算开销少。
- 缺点:容易陷入局部最优解。
- 人工神经网络的优点:
- 非线性拟合能力特别强,只要宽度足够大,深度足够深,可以拟合任何非线性数据。
- 人工神经网络的问题:
- 易受离群点影响,易过拟合(可通过正则化和dropout解决)
- 属性与结果要在0-1之间。
- 输出结果要进行Softmax转化。
四、深度神经网络
- 深度神经网络就是把人工神经网络的深度加深。
- 深度神经网络拟合非线性数据的能力会更强,通常用来做图像识别、语音识别和自然语言处理等,是深度学习的基础。
- 但 深度神经网络耗费的时间资源和空间资源也要大很多。
四、代码实现
>>>import os
>>>import pandas as pd
>>>import tensorflow as tf
>>>from sklearn.model_selection import train_test_split
>>>from sklearn.metrics import accuracy_score,recall_score,f1_score
>>>from keras.models import Sequential
>>>from keras.layers.core import Dense,Activation
>>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
>>>X_tt,X_validation,Y_tt,Y_validation = train_test_split(df.JobLevel,df.JobSatisfaction,test_size=0.2)
>>>X_train,X_test,Y_train,Y_test = train_test_split(X_tt,Y_tt,test_size=0.25)
>>>mdl = Sequential()
>>>mdl.add(Dense(50))
>>>mdl.add(Activation("sigmoid"))
>>>mdl.add(Dense(2))
>>>mdl.add(Activation("softmax"))
>>>mdl.compile(loss="mean_squared_error",optimizer=tf.keras.optimizers.SGD(lr=0.05))
>>>mdl.fit(X_train,Y_train,epochs=50,batch_size=800)
>>>xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
>>>for i in range(len(xy_lst)):
>>> X_part = xy_lst[i][0]
>>> Y_part = xy_lst[i][1]
>>> Y_pred = mdl.predict(X_part).argmax(axis=1)
>>> print(i)
>>> print("NN","-ACC",accuracy_score(Y_part,Y_pred))
>>> print("NN","-REC",recall_score(Y_part,Y_pred,average='macro'))
>>> print("NN","-F1",f1_score(Y_part,Y_pred,average='macro'))
>>> print("="*40)
Epoch 1/50
2/2 [==============================] - 0s 3ms/step - loss: 6.2342
Epoch 2/50
2/2 [==============================] - 0s 1000us/step - loss: 6.2133
Epoch 3/50
2/2 [==============================] - 0s 1ms/step - loss: 6.2000
Epoch 4/50
2/2 [==============================] - 0s 2ms/step - loss: 6.1928
Epoch 5/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1893
Epoch 6/50
2/2 [==============================] - 0s 0s/step - loss: 6.1877
Epoch 7/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1870
Epoch 8/50
2/2 [==============================] - 0s 0s/step - loss: 6.1867
Epoch 9/50
2/2 [==============================] - 0s 0s/step - loss: 6.1866
Epoch 10/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1866
Epoch 11/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 12/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 13/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 14/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 15/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 16/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 17/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 18/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 19/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 20/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 21/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 22/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 23/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 24/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 25/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 26/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 27/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 28/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 29/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 30/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 31/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 32/50
2/2 [==============================] - 0s 999us/step - loss: 6.1865
Epoch 33/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 34/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 35/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 36/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 37/50
2/2 [==============================] - 0s 1ms/step - loss: 6.1865
Epoch 38/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 39/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 40/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 41/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 42/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 43/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 44/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 45/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 46/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 47/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 48/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
Epoch 49/50
2/2 [==============================] - 0s 0s/step - loss: 6.1865
Epoch 50/50
2/2 [==============================] - 0s 1000us/step - loss: 6.1865
0
NN -ACC 0.022675736961451247
NN -REC 0.022099447513812154
NN -F1 0.02807017543859649
========================================
1
NN -ACC 0.017006802721088437
NN -REC 0.01818181818181818
NN -F1 0.02040816326530612
========================================
2
NN -ACC 0.02040816326530612
NN -REC 0.022641509433962266
NN -F1 0.029629629629629627