逻辑回归:确定一个人是否年收入超过5万美元
文章目录
- 1. 问题描述
- 2. 设计简要描述
- 3. 程序清单
- 4. 结果分析
- 5. 调试报告
- 6. 实验小结
1. 问题描述
学会使用学习到的逻辑回归的知识,手动使用梯度下降方法,通过给定的相关数据来完成年薪是否高于50k的二分类预测任务。
2. 设计简要描述
机器学习的三个基本步骤——
程序设计思路——(此图放大可看清)
3. 程序清单
import pandas as pd
import numpy as np
from random import shuffle
from numpy.linalg import inv
import matplotlib.pyplot as plt
from math import floor, log
import osoutput_dir = "output/"def dataProcess_X(rawData):# sex 只有两个属性 先drop之后处理if "income" in rawData.columns:Data = rawData.drop(["sex", 'income'], axis=1)else:Data = rawData.drop(["sex"], axis=1)listObjectColumn = [col for col in Data.columns if Data[col].dtypes == "object"] # 读取非数字的columnlistNonObjedtColumn = [x for x in list(Data) if x not in listObjectColumn] # 数字的columnObjectData = Data[listObjectColumn]NonObjectData = Data[listNonObjedtColumn]# 将数字的column进行归一化: male = 0 以及 female = 1NonObjectData.insert(0, "sex", (rawData["sex"] == " Female").astype(np.int))# 给非数字的column每个属性一个编码ObjectData = pd.get_dummies(ObjectData)Data = pd.concat([NonObjectData, ObjectData], axis=1) # axis=1就是以列为轴拼,横着拼Data_x = Data.astype("int64")# Data_y = (rawData["income"] == " <=50K").astype(np.int)# 利用正态分布来规范化Data_x = (Data_x - Data_x.mean()) / Data_x.std()return Data_xdef dataProcess_Y(rawData):df_y = rawData['income']Data_y = pd.DataFrame((df_y == ' >50K').astype("int64"), columns=["income"]) # 让"income"做表头return Data_y# 将数据夹在[1e-8, 1-1e-8]之间
def sigmoid(z):res = 1 / (1.0 + np.exp(-z))# clip函数的作用:给定一个区间,区间外的值被剪切到区间边缘。return np.clip(res, 1e-8, 1 - 1e-8)def _shuffle(X, Y): # 打乱一列原先的顺序# arange()在给定的区间内返回间隔均匀的值randomize = np.arange(X.shape[0])# random.shuffle()作用是将序列原地洗牌np.random.shuffle(randomize)return (X[randomize], Y[randomize])def split_valid_set(X, Y, percentage): # 从训练集中分割出验证集all_size = X.shape[0]valid_size = int(floor(all_size * percentage))X, Y = _shuffle(X, Y)X_valid, Y_valid = X[: valid_size], Y[: valid_size]X_train, Y_train = X[valid_size:], Y[valid_size:]return X_train, Y_train, X_valid, Y_validdef valid(X, Y, w):a = np.dot(w, X.T)y = sigmoid(a)y_ = np.around(y) # around()函数作用 平均四舍五入到给定的小数result = (np.squeeze(Y) == y_) # squeeze()的作用是变成一维print('acc = %f' % (float(result.sum()) / result.shape[0]))return y_ # 返回经过sigmoid函数的结果# 训练过程及可视化
def train(X_train, Y_train):w = np.zeros(len(X_train[0])) # 列数l_rate = 0.001batch_size = 32train_dataz_size = len(X_train) # 行数step_num = int(floor(train_dataz_size / batch_size))epoch_num = 300list_cost = []for epoch in range(1, epoch_num):total_loss = 0.0X_train, Y_train = _shuffle(X_train, Y_train)for idx in range(1, step_num):X = X_train[idx * batch_size:(idx + 1) * batch_size]Y = Y_train[idx * batch_size:(idx + 1) * batch_size]s_grad = np.zeros(len(X[0]))z = np.dot(X, w)y = sigmoid(z)loss = y - np.squeeze(Y)cross_entropy = -1 * (np.dot(np.squeeze(Y.T), np.log(y)) + np.dot((1 - np.squeeze(Y.T)), np.log(1 - y))) / len(Y)total_loss += cross_entropygrad = np.sum(-1 * X * (np.squeeze(Y) - y).reshape((batch_size, 1)), axis=0)w = w - l_rate * gradlist_cost.append(total_loss)plt.plot(np.arange(len(list_cost)), list_cost, 'r+')plt.title("Training")plt.xlabel("epoch number")plt.ylabel("cross entropy")plt.savefig(os.path.join(os.path.dirname(output_dir), "训练过程"))plt.show()return wif __name__ == "__main__":trainData = pd.read_csv("data/train.csv")testData = pd.read_csv("data/test.csv")ans = pd.read_csv("data/correct_answer.csv")# drop函数默认删除行,列需要加axis = 1x_train = dataProcess_X(trainData).drop(['native_country_ Holand-Netherlands'], axis=1).valuesx_test = dataProcess_X(testData).valuesy_train = dataProcess_Y(trainData).valuesy_ans = ans['label'].values# concatenate()沿着一个现有的轴连接一个数组序列,axis=1表示纵轴x_test = np.concatenate((np.ones((x_test.shape[0], 1)), x_test), axis=1)x_train = np.concatenate((np.ones((x_train.shape[0], 1)), x_train), axis=1)# 从训练集中拿出10%的数据作为验证集valid_set_percentage = 0.1X_train, Y_train, X_valid, Y_valid = split_valid_set(x_train, y_train, valid_set_percentage)# 训练集上训练+训练集上验证print("训练集上训练+训练集上验证,结果如下")w_train = train(X_train, Y_train)valid(X_train, Y_train, w_train)# 原始训练集上训练+测试集上验证print("原始训练集上训练+测试集上验证,结果如下")w = train(x_train, y_train)y_ = valid(x_test, y_ans, w)df = pd.DataFrame({"id": np.arange(1, 16282), "label": y_})if not os.path.exists(output_dir):os.mkdir(output_dir)df.to_csv(os.path.join(output_dir + 'lr_output.csv'), sep='\t', index=False)
4. 结果分析
划分后的训练集上训练+验证集上验证
原始训练集上训练+测试集上验证
控制台输出
实验结果上下有浮动但浮动不大,因为每次从训练集中划分出验证集都是随机的。
5. 调试报告
- 控制台报错AttributeError: module ‘sip’ has no attribute ‘setapi’
查阅资料后发现是matplotlib包的版本不对,试图将其删除再装。由于是通过Pycharm自动安装,只会安装最新版本的。只好换了最初安装Python的解释器,可以在命令行通过pip install matplotlib==3.2 安装想要的版本。问题解决了。
6. 实验小结
加深了对逻辑回归的理解
与实验二相比,w和b是直接求得的,不基于任何概率分布假设。进一步理解了交叉熵
即逻辑回归的损失函数
括号中的两个可以可以看成是两个不同的伯努利分布
分布P是人为定义的:
样本属于Class1就记y ̂为1,属于Class就记y ̂为0
而分布q则是函数集学到了一些数据处理函数/方法
①clip函数的作用:给定一个区间,区间外的值被剪切到区间边缘。
②arange()在给定的区间内返回间隔均匀的值
③random.shuffle()作用是将序列原地洗牌
④around()函数作用 平均四舍五入到给定的小数
⑤squeeze()的作用是将无论什么格式的数据变成一维
⑥drop函数默认删除行,列需要加axis = 1
⑦concatenate()沿着一个现有的轴连接一个数组序列,axis=1表示纵轴本次实验最大的收获是学会了查看官方文档,避免了原先的面向百度开发,受益匪浅。
具体操作:在Pycharm上将光标移动到要查找的函数上方,shift+F1。本次实验和前几次不同的是使用了函数和可视化图表的方式。前者提高了代码的可复用性,后者增加了程序的友好程度。
相关文章:
【特征匹配】ORB原理与源码解析
相关 : Fast原理与源码解析 Brief描述子原理与源码解析 Harris原理与源码解析 http://blog.csdn.net/luoshixian099/article/details/48523267 ORB特征提取详解 ORB特征点检测 为了满足实时性的要求,前面文章中介绍过快速提取特征点算法Fast,以及特征描述子Brief。…

C# 的三种序列化方法
序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。 序列化一个对象 为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被…

DotNetNuke(DNN)网站发布、部署、迁移和重建
DotNetNuke(DNN)网站本质上是一个ASP.NET网站,由网站文件(也就是website目录)和数据库组成的,所以,“发布、部署、迁移和重建”实际上也就是把网站文件和数据库文件拷贝到服务器上并修改相应设置的过程。对于"发布…

PyTorch基础与简单应用:构建卷积神经网络实现MNIST手写数字分类
文章目录(一) 问题描述(二) 设计简要描述(三) 程序清单(四) 结果分析(五) 调试报告(六) 实验小结(七) 参考资料(一) 问题描述 构建卷积神经网络实现MNIST手写数字分类。 (二) 设计简要描述 机器学习的三个基本步骤—— 程序设计思路——(此图放大可看清) (三) 程序清单 …

from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import SelectSelect(d.find_element_by_id(ukey_开户行)).first_selected_option.text转载于:https://www.cnblogs.com/paisen/p/3669272.html

rocketmq-flink
https://github.com/apache/rocketmq-externals/tree/master/rocketmq-flink https://issues.apache.org/jira/browse/ROCKETMQ-82

基于Numpy构建全连接前馈神经网络进行手写数字识别
文章目录(一) 问题描述(二) 设计简要描述(三) 程序清单(四) 结果分析(五) 调试报告(六) 实验小结(一) 问题描述 不使用任何机器学习框架,仅仅通过Numpy库构建一个最简单的全连接前馈神经网络,并用该网络识别mnist提供的手写数字体。 (二) 设计简要描述…

sqlserver 三种恢复模式
sql server数据库提供了三种恢复模式:完整,简单和大容量日志,这些模式决定了sql server如何使用事务日志,如何选择它要记录的操作,以及是否截断日志。截断事务日志是删除己执行事务并把该日志空间让给新事务的过程&…

Confluence 6 配置日志
我们推荐你根据你的需求来配置你自己的 Confluence 日志。你可以有下面 2 种方法来修改你的日志:通过 Confluence 管理员控制台进行配置 – 你的修改仅在本次修改有效,下次重启后将会把所有修改重置。编辑属性文件 – 你的修改将会在下次重启后生效同时针…

最近最近在微软的Mobile Soft factory
最近公司在做PDA项目的开发, 我主要负责Mobile的框架设计和开发。以前都是在做winform程序,对Mobile 的开发 知之甚少,现在突然开始做mobile的项目,压力有点大! 不知该从何处下手,幸好发现微软提供的Mobile…

神经网络训练技巧
文章目录一、问题描述二、 设计简要描述三、程序清单四、结果分析五、调试报告六、实验小结一、问题描述 基于二元函数f(x,y)z1/20 x2y2掌握梯度下降和权重初始化的技巧,基于手写体识别掌握正规化和两种防止过拟合的技巧。 二、 设计简要描述 梯度下降方法 1.1.1 …

Unix的轻巧“约取而实得”(上篇)
在经过上机操作实践以及掌握Unix系统相关的基础知识之后,可以说已跨进了迈向成功的门槛。接着要登堂入室,继续专进,就必须更加深入的了解Unix基本命令的功能、使用并掌握一些必备的技巧。这一轮学习会有一定难度,需要强烈的求知欲…

操作系统2--操作系统结构
操作系统结构 操作系统的结构需要从这几个方面来考虑:他为用户提供了哪些服务和界面,系统各个组成部分及其相互关系 操作系统的操作 大致可分为:进程管理,主存管理,文件管理,辅存管理和IO管理 进程管理 进程的创建和结束进程的挂起和恢复进程锁\进程交互\进程死锁的规则内存管理…

Windows环境下启动Mysql服务提示“1067 进程意外终止”的解决方案
2019独角兽企业重金招聘Python工程师标准>>> 在Windows服务里启动Mysql服务时提示“1067 进程意外终止”。 此时我们打开计算机管理查看Windows日志,如下图所示: 完整错误提示如下: The server option lower_case_table_names is …

不使用任何框架实现CNN网络
文章目录一、 问题描述二、 设计简要描述三、程序清单四、结果分析五、调试报告六、实验小结一、 问题描述 基于Numpy和函数im2col与col2im来实现一个简单的卷积神经网络,将其用于手写体识别。 二、 设计简要描述 机器学习的三个基本步骤—— 程序设计思路——(…

关于刘冬大侠Spring.NET系列学习笔记3的一点勘正
诚如他第22楼“只因渴求等待”提出的疑问一样,他的下面那一段代码是存在一点点问题的, XElement root XElement.Load(fileName);var objects from obj in root.Elements("object") select obj; 如果照搬照抄刘冬大侠的这段代码那是不会成功读…

什么叫做KDJ指标
什么叫做KDJ指标 KDJ指标的中文名称是随机指数,最早起源于期货市场。 KDJ指标的应用法则KDJ指标是三条曲线,在应用时主要从五个方面进行考虑:KD的取值的绝对数字;KD曲线的形态;KD指标的交叉;KD指标的背离&a…
vim常用命令总结 (转)
在命令状态下对当前行用 (连按两次), 或对多行用n(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n排版,相当于一般IDE里的code format。使用ggG可对整篇代码进行排版。 vim 选择文本&…

敏捷过程、极限编程和SCRUM的关系
极限编程是最知名的敏捷开发过程,SCRUM是最经典的极限编程。 层次关系从大到小是:敏捷过程>极限编程>SCRUM

C#双面打印解决方法(打印word\excel\图片)
最近需要按顺序打印word、excel、图片,其中有的需要单面打印,有的双面。网上查了很多方法。主要集中在几个方式解决 1、word的print和excel的printout里设置单双面 2、printdocument里的printsettings的duplex设置单双面 试过之后效果都不好,…

【leetcode】589. N-ary Tree Preorder Traversal
题目如下: 解题思路:凑数题1,话说我这个也是凑数博? 代码如下: class Solution(object):def preorder(self, root):""":type root: Node:rtype: List[int]"""if root None:return []re…

MSDN Visual系列:创建Feature扩展SharePoint列表项或文档的操作菜单项
原文:http://msdn2.microsoft.com/en-us/library/bb418731.aspx在SharePoint中我们可以通过创建一个包含CustomAction元素定义的Feature来为列表项或文档添加一个自定义操作菜单项(Entry Control Block Item)。我们可以添加自定义命令到默认的SharePoint用户界面中。…

评审过程中,A小组发现了5个缺陷,B小组发现了9个缺陷,他们发现的缺陷中有3个是相同的。请问:还有多少个潜在的缺陷没有发现?
分析:这一个“捉-放-捉”问题 背景: 求解: 可以将A看成是第一次捕捉,发现了5个缺陷,全部打上标记 B看成是第二次捕捉,发现了9个缺陷,其中有3个有标记 那么可以算出系统中一共存在的缺陷数量为…

Dell PowerVault TL4000 磁带机卡带问题
最近一段时间Dell PowerVault TL4000 磁带机故障频繁,昨天我在管理系统里面看到Library Status告警:HE: sled blocked, error during sled movement to rotation position Code: 8D 07 ,Dell工程师根据Code: 8D 07判断是磁带卡带了࿰…

【git】git入门之把自己的项目上传到github
1. 首先当然是要有一个GIT账号:github首页 2. 然后在电脑上安装一个git:git首页 注册和安装这里我就不说了。我相信大家做这个都没有问题。 3. 上述两件事情做完了,就登陆到github页面 1)首先我们点标注【1】的小三角,…

Java面试查漏补缺
一、基础 1、&和&&的区别。 【概述】 &&只能用作逻辑与(and)运算符(具有短路功能);但是&可以作为逻辑与运算符(是“无条件与”,即没有短路的功能)…

selenium之frame操作
前言 很多时候定位元素时候总是提示元素定位不到的问题,明明元素就在那里,这个时候就要关注你所定位的元素是否在frame和iframe里面 frame标签包含frameset、frame、iframe三种,frameset和普通的标签一样,不会影响正常的定位&…

(C++)将整型数组所有成员初始化为0的三种简单方法
#include<cstdio> #include<cstring>int main(){//1.方法1 int a[10] {};//2.方法2 int b[10] {0};//3.方法3 注意:需要加 <cstring>头文件 int c[10];memset(c,0,sizeof(c));for(int i0;i<9;i){printf("a[%d]%d\n",i,a[i]);}prin…

(C++)对用户输入的整形数组进行冒泡排序
#include<cstdio>//冒泡排序的本质在于交换 //1.读入数组 //2.排序 //3.输出数组 int main(){int a[10];printf("%s","请依次输入数组的10个整型元素:\n");for(int i0;i<9;i){scanf("%d",&a[i]);} int temp 0;for(int …

U3D的Collider
被tx鄙视的体无完肤,回来默默的继续看书,今天看u3d,试了下collider,发现cube添加了rapidbody和boxcollider后落在terrain后就直接穿过去了... 找了一会原因,看到一个collider的参数说明: 分别选中立方体和树的模型&…