使用python实现逻辑回归算法

数据来源:鸢尾花数据集

导入数据集,选取用来做试验的数据

df = pd.read_csv('data/iris.csv')# 选取 setosa 和 versicolor 两种花
# 两种各选择50个, 把类别改为 0 和 1, 方便画图
y = df.iloc[0:100, 4].values
y = np.where(y == 'setosa', 0, 1)# 提取 sepal length 和 petal length 两种特征的数据
X = df.iloc[0:100, [0, 2]].values# 特征标准化
X_std = np.copy(X)
X_std[:,0] = (X[:,0] - X[:,0].mean()) / X[:,0].std()
X_std[:,1] = (X[:,1] - X[:,1].mean()) / X[:,1].std()

从左到右依次为花萼长度、花萼宽度、花瓣长度、花瓣宽度和花的种类

实现逻辑回归算法中梯度下降的类

这里参数很多,结合https://blog.csdn.net/After__today/article/details/81604249中的逻辑回归的假设函数、代价函数和更新规则来理解。

y_val计算的值,errors计算的是(真实值)的差。

neg_grad计算的是更新规则中的

w_ += eta * neg_grad实现w_(即)的更新,这里为什么是 + 呢,因为 errors = (y - y_val)。

cost记录每一轮迭代中的代价值,_logit_cost函数实现的计算。

predict_proba函数预测样本X为1的概率的估计值。

predict预测X的标签为 0 或 1。

class LogisticRegression(object):"""参数----------eta : float学习速率 (between 0.0 and 1.0)n_iter : int迭代次数-----------属性----------w_ : 1d-array拟合后的权重, 即θcost_ : list每次迭代的代价, 即Jθ"""def __init__(self, eta, n_iter):self.eta = etaself.n_iter = n_iter# 训练函数def fit(self, X, y):""" 参数----------X : {array-like}, shape = [n_samples, n_features]训练集特征向量, n_samples为样本数量, n_features为特征向量的数量y : array-like, shape = [n_samples]训练集的目标值----------Returns----------self : object"""self.w_ = np.zeros(X.shape[1])self.cost_ = []for i in range(self.n_iter):y_val = self.activation(X)errors = (y - y_val)neg_grad = X.T.dot(errors)self.w_ += self.eta * neg_gradself.cost_.append(self._logit_cost(y, self.activation(X)))return selfdef _logit_cost(self, y, y_val):"""计算代价函数值"""logit = -y.dot(np.log(y_val)) - ((1 - y).dot(np.log(1 - y_val)))return logitdef _sigmoid(self, z):"""计算逻辑函数值"""return 1.0 / (1.0 + np.exp(-z))def net_input(self, X):"""计算逻辑函数输入"""return np.dot(X, self.w_)def activation(self, X):"""激活逻辑神经元"""z = self.net_input(X)return self._sigmoid(z)def predict_proba(self, X):"""样本X为1的概率的估计值"""return self.activation(X)def predict(self, X):"""预测X的标签, 将大于0的值归为1, 小于0的归为0"""return np.where(self.net_input(X) >= 0.0, 1, 0)

绘制代价函数

# 学习速率0.02, 迭代次数500次
lr = LogisticRegression(n_iter=500, eta=0.02).fit(X_std, y)
plt.plot(range(1, len(lr.cost_) + 1), np.log10(lr.cost_))
plt.xlabel('Epochs')
plt.ylabel('Cost')
plt.title('Logistic Regression - Learning rate 0.02')
plt.tight_layout()

利用ListedColormap编写绘制边界函数

def plot_decision_regions(X, y, classifier, resolution=0.02):# 利用ListedColormap设置 marker generator 和 color mapmarkers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])# 确定横纵轴边界x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1  # 最小-1, 最大+1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1# 建立一对grid arrays(网格阵列)# 铺平grid arrays,然后进行预测xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) # .revel()降维函数Z = Z.reshape(xx1.shape)# 将不同的决策边界对应不同的颜色plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)# 设置坐标轴的范围plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())# 绘制样本点for idx, cl in enumerate(np.unique(y)):plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)

绘制分类边界

plot_decision_regions(X_std, y, classifier=lr)
plt.title('Logistic Regression - Gradient Descent')
plt.xlabel('sepal length [std]')
plt.ylabel('petal length [std]')
plt.legend(loc='upper left')
plt.tight_layout()

利用scikit-learn进行分类任务

加载数据,特征标准化处理

iris = datasets.load_iris()
X = iris.data[:, [2, 3]]   # 这里我们选择对三种花分类
y = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))

重新定义个画分类边界的函数

def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):markers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())for idx, cl in enumerate(np.unique(y)):plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)if test_idx:X_test = X[test_idx, :]plt.scatter(X_test[:, 0], X_test[:, 1], c='b', alpha=0.1, linewidth=1, marker='o', s=55, label='test sets')

利用logistic regression建模分类

lr = LogisticRegression(C=1000.0, random_state=0)   # C是正则化系数λ的倒数
lr.fit(X_train_std, y_train)plot_decision_regions(X_combined_std, y_combined, classifier=lr, test_idx=range(105,150))
plt.xlabel('petal length [std]')
plt.ylabel('petal width [std]')
plt.legend(loc='upper left')
plt.tight_layout()

拿个例子看看预测效果:

predict_proba输出的是预测x为某一类的概率

解决拟合过程中的过拟合问题

过拟合问题在这篇笔记中有介绍https://blog.csdn.net/After__today/article/details/81805645。

这里我们手动实现利用正则化项解决过拟合问题。

代码只是在LogisticRegression()中加入了正则化项。

class LogitGD(object):def __init__(self, eta=0.01, lamb = 0.01, n_iter=50):self.eta = etaself.n_iter = n_iterself.lamb = lamb   # lamb为正则化项的系数λdef fit(self, X, y):self.w_ = np.zeros(X.shape[1])self.cost_ = []for i in range(self.n_iter):output = self.net_input(X)errors = (y - output)self.w_ += self.eta * X.T.dot(errors) - self.lamb* self.w_cost = (errors**2).sum() / 2.0 + self.lamb* np.sum(self.w_**2)self.cost_.append(cost)return selfdef net_input(self, X):return np.dot(X, self.w_)def sigmoid(z):return 1.0 / (1.0 + np.exp(-z))def activation(self, X):return self.sigmoid(self.net_input(X))def predict(self, X):return np.where(self.activation(X) >= 0.5, 1, -1)

完整代码见:https://github.com/After-today/Classification-problem。

Machine Learning笔记——逻辑回归算法相关推荐

  1. Machine Learning | 基于逻辑回归做二分类进行癌症预测

    导入包 import pandas as pd import numpy as np from sklearn.datasets import load_boston from sklearn.lin ...

  2. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法

    在上一篇文章<机器学习笔记(9)--深入理解逻辑回归算法及其Python实现>中,详细学习了逻辑回归算法的分类原理和使用梯度下降法来最小化损失函数的数学推导过程,从而拟合出分类函数的参数θ ...

  3. 算法笔记(11)逻辑回归算法及Python代码实现

    逻辑回归算法是一种被广泛使用的分类算法,通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数.逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布. 因此与线性回归 ...

  4. 机器学习笔记(七)——逻辑回归算法

    逻辑回归(Logistic Regression,LR).在Kaggle竞赛的统计中,LR算法以63.5%的出产率,荣获各领域中"出场率最高的算法"这一殊荣.在实际场景中,逻辑回归 ...

  5. Machine Learning:如何选择机器学习算法?

    2019独角兽企业重金招聘Python工程师标准>>> Machine Learning Algorithms Overview 关于目前最流行的一些机器学习算法,建议阅读: Mac ...

  6. coursera—吴恩达Machine Learning笔记(1-3周)

    Machine Learning 笔记 笔记主要按照进度记录上课主要内容和部分代码实现,因为我会看一阶段再进行整理,内容会有一定交叉.关于代码部分,一开始我是只为了做作业而写代码的,现在觉得不妨仔细看 ...

  7. Auto Machine Learning笔记 - Bayesian Optimization

    原文链接:Auto Machine Learning笔记 - Bayesian Optimization 优化器是机器学习中很重要的一个环节.当确定损失函数时,你需要一个优化器使损失函数的参数能够快速 ...

  8. ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以scorecardpy框架全流程讲解

    ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以scorecardpy框架全流程讲解 目录 基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分 ...

  9. 逻辑回归算法c语言_逻辑回归算法背后的数学

    逻辑回归算法背后的数学 看完深蓝学院的机器学习公开课后,对于逻辑回归部分,打算写篇学习笔记记录总结一下,也和大家共同分享. 1 基本思能 逻辑回归(Logistic Regression)和线性回归( ...

  10. Machine Learning笔记(三) 多变量线性回归

    2019独角兽企业重金招聘Python工程师标准>>> Machine Learning笔记(三) 多变量线性回归 注:本文内容资源来自 Andrew Ng 在 Coursera上的 ...

最新文章

  1. 突发!Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响
  2. 程序员工资为什么高?
  3. Python入门100题 | 第021题
  4. Spring 为啥默认把 bean 设计成单例的?
  5. mysql5.7.11解压版_Mysql5.7.11在windows10上的安装与配置(解压版)_MySQL
  6. Windows下UltraEdit查看Objective-C代码高亮工具
  7. Open Infrastructure开启开放协作新时代
  8. 华为手机8.0.0怎么找到云相册_华为G9怎么找到云相册_失而复得 华为“查找手机”功能有多强大?快来了解一下......
  9. 线性最小二乘法(附MATLAB代码)
  10. 80端口未被占用,无法启动wamp的解决方法(原创)
  11. CentOS6.5配置网易163做yum源
  12. css基础知识汇总7
  13. activemq linux 100M,Linux下安装 activemq 并指定jdk 1.8(示例代码)
  14. 运用递归来画谢尔宾斯基三角形
  15. 一些用的上的在线网站
  16. antd menu 样式修改
  17. day 32 子进程的开启 及其用法
  18. cad捕捉不到标注线上的点_CAD为什么捕捉不到正在绘制的多段线上的点?
  19. python期末试题汇总
  20. 那李逵是穿山度岭 水浒

热门文章

  1. H3C交换机端口链路聚合
  2. 最火照片墙前端纯HTML(只需添加照片)
  3. TransTrack简述
  4. android 音乐柱状图动画,android 音乐播放柱形图
  5. ​特拉华大学彭曦教授招收2021 Fall全奖博士生
  6. dell t320 raid linux,Dell T320服务器阵列卡驱动下载
  7. 【Tinking in Java摘录笔记】第六章 初始化和清理
  8. JS时间戳进行判断,判断是否超时三十分钟
  9. Codewars-Java编程刷题学习4-Jaden Casing Strings
  10. 3Q之战广东高院上演“熟人新案”