【实验目的】
理解逻辑回归算法原理,掌握逻辑回归算法框架;
理解逻辑回归的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.策略边界函数
逻辑回归应用场景
逻辑回归的应用场景有数据挖掘,疾病自动诊断,经济预测等领域
标签:iris,逻辑,plt,sigmoid,回归,算法,实验,np,data From: https://www.cnblogs.com/xiaogaoa/p/16863579.html