实验二:逻辑回归算法实验

【实验目的】

理解逻辑回归算法原理,掌握逻辑回归算法框架;
理解逻辑回归的sigmoid函数;
理解逻辑回归的损失函数;
针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。

【实验内容】

1.根据给定的数据集,编写python代码完成逻辑回归算法程序,实现如下功能:

建立一个逻辑回归模型来预测一个学生是否会被大学录取。假设您是大学部门的管理员,您想根据申请人的两次考试成绩来确定他们的入学机会。您有来自以前申请人的历史数据,可以用作逻辑回归的训练集。对于每个培训示例,都有申请人的两次考试成绩和录取决定。您的任务是建立一个分类模型,根据这两门考试的分数估计申请人被录取的概率。
算法步骤与要求:

(1)读取数据;(2)绘制数据观察数据分布情况;(3)编写sigmoid函数代码;(4)编写逻辑回归代价函数代码;(5)编写梯度函数代码;(6)编写寻找最优化参数代码(可使用scipy.opt.fmin_tnc()函数);(7)编写模型评估(预测)代码,输出预测准确率;(8)寻找决策边界,画出决策边界直线图。

2. 针对iris数据集,应用sklearn库的逻辑回归算法进行类别预测。

要求:

(1)使用seaborn库进行数据可视化;(2)将iri数据集分为训练集和测试集(两者比例为8:2)进行三分类训练和预测;(3)输出分类结果的混淆矩阵。

【实验报告要求】

对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
实验报告中需要显示并说明涉及的数学原理公式;
查阅文献,讨论逻辑回归算法的应用场景;

实验内容及结果

1.根据给定的数据集,编写python代码完成逻辑回归算法程序,实现如下功能:

 (1)读取数据

import pandas as pd
data=pd.read_table("D:/data/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函数代码

 

def sigmoid(z):
return 1 / (1 + np.exp(-z))
nums = np.arange(-10, 10, step=1)

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(nums, sigmoid(nums), 'r')
plt.show()

 

 

 

(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)编写寻找最优化参数代码(可使用scipy.opt.fmin_tnc()函数)

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,100)
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()

 

 

2. 针对iris数据集,应用sklearn库的逻辑回归算法进行类别预测

复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
data = load_iris() 
iris_target = data.target  
iris_features = pd.DataFrame(
    data=data.data, columns=data.feature_names)  
# 合并标签和特征信息
iris_all = iris_features.copy()  
iris_all['target'] = iris_target
# 特征与标签组合的散点可视化
sns.pairplot(data=iris_all, diag_kind='hist', hue='target')
plt.show()
复制代码

 

 

 

复制代码
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 将训练集测试集按照8:2比例划分
X_train, X_test, y_train, y_test = train_test_split(
    iris_features, iris_target, test_size=0.2, random_state=2020)
clf = LogisticRegression(random_state=0, solver='lbfgs')
clf.fit(X_train, y_train)
print('逻辑回归的权重:\n', clf.coef_) 
print('逻辑回归的截距(w0)\n', clf.intercept_,'\n')  # 查看偏置
train_predict = clf.predict(X_train)
test_predict = clf.predict(X_test)
print(train_predict,'\n\n', test_predict)
复制代码

复制代码
from sklearn import metrics
print('逻辑回归准确度:',
      metrics.accuracy_score(y_train, train_predict))
print('逻辑回归准确度:',
      metrics.accuracy_score(y_test, test_predict))
# 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(y_test, test_predict)
print('混淆矩阵结果:\n', confusion_matrix_result)
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Greens')
plt.xlabel('Predictedlabels')
plt.ylabel('Truelabels')
plt.show()
复制代码

 

实验小结:

逻辑回归的一般过程

收集数据:采用任意方法收集数据
准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则为最佳
分析数据:采用任意方法对数据进行分析
训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数
测试算法:一旦训练步骤完成,分类将会很快
使用算法:首先,我们需要输入一些数据并将其转换成对应的结构化数值,接着,基于训练好的回归系数就可以对这些进行简单的回归计算,

判定它们属于哪个类别;在这那之后,我们就可以在输出的类别上做一些其他分析工作

1.sigmoid函数

sigmoid的优点在于输出范围有限,所以数据在传递的过程中不容易发散。 当然也有相应的缺点,就是饱和的时候梯度太小。

sigmoid还有一个优点是输出范围为 (0, 1),所以可以用作输出层,输出表示概率

 

 

 2.代价函数

3.梯度下降

 

 4.策略边界函数

 

 

 

逻辑回归应用场景

 逻辑回归的应用场景有数据挖掘,疾病自动诊断,经济预测等领域

 

 

posted @   201613325  阅读(193)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示