实验二:逻辑回归算法实验
班级:20大数据(3)班
学号:201613341
【实验目的】
理解逻辑回归算法原理,掌握逻辑回归算法框架;
理解逻辑回归的sigmoid函数;
理解逻辑回归的损失函数;
针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。
【实验内容】
1.根据给定的数据集,编写python代码完成逻辑回归算法程序,实现如下功能:
建立一个逻辑回归模型来预测一个学生是否会被大学录取。假设您是大学部门的管理员,您想根据申请人的两次考试成绩来确定他们的入学机会。您有来自以前申请人的历史数据,可以用作逻辑回归的训练集。对于每个培训示例,都有申请人的两次考试成绩和录取决定。您的任务是建立一个分类模型,根据这两门考试的分数估计申请人被录取的概率。
算法步骤与要求:
(1)读取数据;(2)绘制数据观察数据分布情况;(3)编写sigmoid函数代码;(4)编写逻辑回归代价函数代码;(5)编写梯度函数代码;(6)编写寻找最优化参数代码(可使用scipy.opt.fmin_tnc()函数);(7)编写模型评估(预测)代码,输出预测准确率;(8)寻找决策边界,画出决策边界直线图。
- 针对iris数据集,应用sklearn库的逻辑回归算法进行类别预测。
【实验要求】
【实验内容要求】
(1)使用seaborn库进行数据可视化;(2)将iri数据集分为训练集和测试集(两者比例为8:2)进行三分类训练和预测;(3)输出分类结果的混淆矩阵。
【实验报告要求】
对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
实验报告中需要显示并说明涉及的数学原理公式;
查阅文献,讨论逻辑回归算法的应用场景。
【实验代码及截图】
一、根据给定的数据集,编写python代码完成逻辑回归算法程序
1.读取数据
点击查看代码
import pandas as pd
data=pd.read_table("ex2data1.txt",sep = ",",header=None)
data.columns=['exam1','exam2','isTF']
data
2.绘制数据观察数据分布情况
点击查看代码
#绘制数据观察数据分布情况
import matplotlib.pyplot as plt
dataT=data[data['isTF'].isin([1])]
dataF=data[data['isTF'].isin([0])]
plt.scatter(dataT['exam1'],dataT['exam2'])
plt.scatter(dataF['exam1'],dataF['exam2'])
plt.show()
3.编写sigmoid函数代码
点击查看代码
#编写sigmoid函数代码
import numpy as np
def f_sigmoid(z):
return 1/(1+np.exp(-z)) #预测值
4.编写逻辑回归代价函数代码
点击查看代码
#编写逻辑回归代价函数代码 损失函数用于单样本检验,代价函数用于多样本检验
data.insert(0, 'ones',1)
xi=np.array(data.iloc[:,0:3]) #exam1列和exam2列的数据转换为数组
yi=np.array(data.iloc[:,3:4]) #isTF列的数据转换为数组
wi=np.zeros(3)
def f_cost(w,x,y):
w=np.matrix(w) #wi转换为矩阵
z=f_sigmoid(np.dot(x,(w.T))) #调用sigmoid函数,dot函数计算两个矩阵内积
Lw=np.sum(np.multiply(y,(-np.log(z)))+np.multiply((1-y),(-np.log(1-z))))/len(x) #代价函数
return Lw
f_cost(wi,xi,yi)
5.编写梯度函数代码
点击查看代码
#编写梯度函数代码
def tidu(w,x,y):
w=np.matrix(w)
z=f_sigmoid(np.dot(x,(w.T)))
WL=np.dot(((z-y).T),x)/len(x)
return np.array(WL).flatten()
tidu(wi,xi,yi)
6.编写寻找最优化参数代码
点击查看代码
#编写寻找最优化参数代码
from scipy import optimize
result = optimize.fmin_tnc(func=f_cost, x0=wi, fprime=tidu, args=(xi, yi))
wi=result[0]
print(result)
7.编写模型评估(预测)代码,输出预测准确率
点击查看代码
#编写模型评估(预测)代码,输出预测准确率
def predict(w,x):
w=np.matrix(w)
z=f_sigmoid(x*(w.T))
return [1 if i >= 0.5 else 0 for i in z] #通过sigmoid函数值预测结果>=0.5为1,否则为0
predictValues=predict(wi,xi)
hypothesis=[1 if a==b else 0 for (a,b)in zip(predictValues,yi)] #用预测值与实际值进行比较,相等为1,否则为0
accuracy=hypothesis.count(1)/len(hypothesis)
accuracy
8.寻找决策边界,画出决策边界直线图
点击查看代码
#寻找决策边界,画出决策边界直线图
x1=np.linspace(30,100,1000)
def boundary(X,w):
return [(-w[0]-w[1]*i)/w[2] for i in x1]
x2=boundary(x1,wi)
plt.scatter(dataT['exam1'],dataT['exam2'])
plt.scatter(dataF['exam1'],dataF['exam2'])
plt.plot(x1,x2,color='r')
plt.show()
二、针对iris数据集,应用sklearn库的逻辑回归算法进行类别预测
1.使用seaborn库进行数据可视化
点击查看代码
#使用seaborn库进行数据可视化
iris=load_iris()
X=iris.data #iris数据集的数据
iris_target=iris.target #数据对应的标签
iris_features=pd.DataFrame(X, columns=iris.feature_names) #利用Pandas转化为DataFrame格式
sns.jointplot(data=iris_features) #使用seaborn库中的jointplot可视化
plt.show()
2.将iri数据集分为训练集和测试集(两者比例为8:2)进行三分类训练和预测
点击查看代码
#将iri数据集分为训练集和测试集(两者比例为8:2)进行三分类训练和预测
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import seaborn as sns
from sklearn import metrics
iris=load_iris()
X=iris.data #iris数据集的数据
Y=iris.target #样本的目标属性,用0,1,2分别代表鸢尾花的品种
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=42) #划分训练集和测试集,按照8:2的比例划分
print(X_train.shape)
print(X_test.shape)
log_reg = LogisticRegression(max_iter=3000) #设置最大迭代次数为3000
clm=log_reg.fit(X_train,Y_train)
#预测
train_predict = log_reg.predict(X_train)
test_predict = log_reg.predict(X_test)
print("预测评分:",metrics.accuracy_score(Y_train,train_predict))
3.输出分类结果的混淆矩阵
点击查看代码
#输出分类结果的混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,Y_test)
print('混淆矩阵结果:\n',confusion_matrix_result)
【实验小结】
1.sigmoid函数表达式
对于较大的x正值,sigmoid 函数应该接近1,对于较大的负值,sigmoid 函数应该接近0
2.代价函数公式
3.梯度公式
4.策略边界函数
5.逻辑回归算法的应用场景及适用场景
(1)应用场景:
①用于分类:适合做很多分类算法的基础组件。
②用于预测:预测事件发生的概率(输出)。
③用于分析:单一因素对某一个事件发生的影响因素分析(特征参数值)。
(2)适用场景:
①基本假设:输出类别服从伯努利二项分布。
②样本线性可分。
③特征空间不是很大的情况。
④不必在意特征间相关性的情景。
⑤后续会有大量新数据的情况。