机器学习二 逻辑回归作业

作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的。

57维特征,2分类问题。采用逻辑回归方法。但是上述数据集在kaggle中没法下载,于是只能用替代的方法了,下了breast-cancer-wisconsin数据集。

链接在这http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data

9个特征,标签分别为2/4 第一个为序号,没有表头,一共699个数据,但有些数据有缺失? 采取丢弃

不说了,上代码,看看怎么弄。

第一步: 读取原始数据集,并去除数据缺失的数据,并将标签变为0/1

 1 # -*- coding: utf-8 -*-
 2 __author__ = ‘Administrator‘
 3
 4 import csv
 5 import cv2
 6 import sys
 7 import numpy as np
 8 import math
 9 import random
10
11 filename = ‘F:/台湾机器学习/data/2/data.csv‘
12 ufilename = unicode(filename , "utf8") #这一块主要是因为汉字路径 也就是python调用open打开文件时,其路径必须要转换为utf-8格式
13 list=[]
14 result=[]
15 row=0
16 colum=0;
17 with open(ufilename, ‘r‘) as f:
18     data = f.readlines()  #dat中所有字符串读入data
19     for line in data:
20         odom = line.split(‘,‘)        #将单个数据分隔开存好
21         colum=len(odom)
22         if ‘?‘in odom:
23             print(odom)
24         else:
25             lists= map(int, odom[1:11])#第一个开始开始数据  一直取10个数
26             if lists[9]==2:
27                 lists[9]=0
28             else:
29                 lists[9]=1
30             list.append(lists)
31             # print odom
32         row=row+1
33
34 print("原始数据是:{0}行 :{1}列 的数据".format(row, colum))
35 print("有{0}个训练数据".format(len(list)))
第二步: 随机划分数据集为训练和测试集,并且保存到csv文件中, 默认是583个训练 100个测试
 1 #保存为训练集和测试集合
 2 #输出最后的测试结果
 3
 4 l=[]
 5 csvfile = file(‘F:\\csv_train.csv‘, ‘wb‘)
 6 writer = csv.writer(csvfile)
 7 #n=input(‘你想选几个?‘)
 8 n=583
 9 while n>len(list) or n<=len(list)/2:
10     print ‘数据集选择错误‘
11     n=input(‘请重新输入一个合适的的数:‘)
12
13 print(list[0])
14 while n!=len(l):
15     x=random.randint(0,len(list)-1)
16     if x in l:
17         continue
18     else:
19         print(x)
20         l.append(x)
21         print(list[x])     #tuple不能赋值进行修改
22         writer.writerow(list[x]) #必须是row 没有s
23 csvfile.close()
24 print l
25 csvfiletest = file(‘F:\\csv_test.csv‘, ‘wb‘)
26 writer = csv.writer(csvfiletest)
27 for  i in range(len(list)):
28     if i in l:
29         continue
30     else:
31        writer.writerow(list[i]) #必须是row 没有s
32 csvfile.close()

第三步: 读取训练集开始训练:

 1 # -*- coding:UTF-8 -*-
 2 __author__ = ‘tao‘
 3
 4 import csv
 5 import cv2
 6 import sys
 7 import numpy as np
 8 import math
 9 from sklearn.linear_model import LogisticRegression
10
11 filename = ‘F:/台湾机器学习/data/2/csv_train.csv‘
12 ufilename = unicode(filename , "utf8") #这一块主要是因为汉字路径 也就是python调用open打开文件时,其路径必须要转换为utf-8格式
13 list=[]
14 result=[]
15 row=0
16 colum=0;
17 with open(ufilename, ‘r‘) as f:
18     data = f.readlines()  #dat中所有字符串读入data
19     for line in data:
20         odom = line.split(‘,‘)        #将单个数据分隔开存好
21         colum=len(odom)
22         lists= map(int, odom[0:9])#第三个开始开始数据  一直取9个数
23         results= map(int, odom[9:10])#取第10个数
24         list.append(lists)
25         result.append(results)
26             # print odom
27         row=row+1
28
29 print("原始数据是:{0}行 :{1}列 的数据".format(row, colum))
30 print("有{0}个训练数据".format(len(list)))
31
32
33 #y=w0*x0+w1*x1+w2*x2+w3*x3+w4*x4+w5*x5+w6*x6+w7*x7+w8*x8+b0
34 #z=1/(1+exp(y))
35 #
36 alpha=0.01
37 b_0=np.random.rand(1,1)
38 th = np.random.rand(1,9);
39 print(th)
40 b_0=np.array([[0]])
41
42 th= np.array([[1, 1, 1, 1, 1, 1, 1 ,1, 1]])
43 print(th)
44
45 L =[]
46 batch=100
47 for k in range(2000):
48     length = len(list)
49     jtheta = 0
50     total = 0
51     sum_total = 0
52     count=0
53     error =0
54     for j in range(batch): #batch
55         # print("当前序号{0}训练数据".format(id))
56         xset= np.array(list[j+count*batch]) #一行 X数值
57         yset= np.array(result[j+count*batch]) # 要估计值
58         z=1.0/(1+math.exp((np.dot(th,xset)+b_0)*(-1)))
59         total = total+z- yset
60         error= error +(-1)*(yset*math.log(z,math.e)+(1-yset)*(1-math.log(z,math.e)))
61         # print( "当前误差{0}".format(b_0 +np.dot(th,xset)- yset))
62     b_0 = b_0  - 1.0*alpha/batch*(total)
63     th = th  -  1.0*alpha/batch*(total)*xset
64     L.append(error)
65     count = count +1
66     if(count>=len(list)/batch):
67         break;
68     if(j==batch-1):
69         print " %10.5f  %10.5f %10.5f   %10.5f  %10.5f  %10.5f %10.5f   %10.5f  %10.5f  %10.5f \n" %(b_0,th[0][0],th[0][1],th[0][2],th[0][3],th[0][4],th[0][5],th[0][6],th[0][7],th[0][8])
70
71 #
72 print("-训练得到的权值如下--")
73 print" %10.5f %10.5f  %10.5f %10.5f   %10.5f  %10.5f  %10.5f %10.5f   %10.5f  %10.5f \n" %(b_0,th[0][0],th[0][1],th[0][2],th[0][3],th[0][4],th[0][5],th[0][6],th[0][7],th[0][8])

第四部:测试

#测试训练集
count=0;
for k in range(len(list)):
    xset = np.array(list[k])
    nptresult= np.array(result[k])
     # print(xset)
    # print("预测数据{0}".format( b_0 + th_0 * xset[0]+ th_1 * xset[1]+ th_2 * xset[2]+ th_3 * xset[3]+ th_4 * xset[4]+ th_5 * xset[5]+ th_6 * xset[6]+ th_7 * xset[7]+ th_8 * xset[8]))
    # print("真实数据{0}".format(nptresult))
    z=1.0/(1+math.exp((np.dot(th,xset)+b_0)*(-1)))
    if z>=0.5:
        lgresult=1;
    else:
        lgresult=0;
    if lgresult == nptresult:
        continue
    else:
        count = count+1;
        print("第几个{0}出错".format(k))
print(count)
print("训练数据集的正确率为{0}".format(1-1.0*count/len(list)))

import matplotlib.pyplot as plt

plt.plot(range(len(L)), L, ‘r‘)
plt.xlabel(‘index‘)
plt.ylabel(‘error‘)
plt.title(‘line_regression & gradient decrease‘)
plt.legend()
plt.show()

## 采用模型
# lr = LogisticRegression()
# lr.fit(list,result)
# count=0
# for k in range(len(list)):
#     xset = np.array(list[k])
#     nptresult= np.array(result[k])
#     ly_y_predict= lr.predict(xset)
#     if ly_y_predict == nptresult:
#         continue
#     else:
#         count = count+1;
#         print("第几个{0}出错".format(k))
# print(count)
# print("采用sk模型训练数据集的正确率为{0}".format(1-1.0*count/len(list)))
#
# print ‘accuragy‘,lr.score(list,result)

#读取测试集数据
testfilename = ‘F:/台湾机器学习/data/2/csv_test.csv‘
utestfilename = unicode(testfilename , "utf8") #这一块主要是因为汉字路径 也就是python调用open打开文件时,其路径必须要转换为utf-8格式
testlist=[]
testresult=[]
testrow=0
testcolum=0;

with open(utestfilename, ‘r‘) as f:
    testdata = f.readlines()  #dat中所有字符串读入data
    for line in testdata:
        odom = line.split(‘,‘)        #将单个数据分隔开存好
        testcolum=len(odom)
        testlists= map(int, odom[0:9])#第三个开始开始数据  一直取9个数
        testlist.append(testlists)
        testresults= map(int, odom[9:10])#取第10个数
        testresult.append(testresults)
            # print odom
        testrow=testrow+1

print("测试数据是:{0}行 :{1}列 的数据".format(testrow, testcolum))
print("有{0}个测试数据".format(len(testlist)))

# #我的模型读取测试数据
tcount=0
for k in range(len(testlist)):
    xset = np.array(testlist[k])
    nptresult= np.array(testresult[k])
    z= 1.0/(1+math.exp((np.dot(th,xset)+b_0)*(-1)))
    lgresult=0
    if z>=0.5:
        lgresult=1;
    else:
        lgresult=0;
    if lgresult == nptresult:
        continue
    else:
        tcount = tcount+1;
        print("第几个{0}出错".format(k))
print(tcount)
print("测试数据集的正确率为{0}".format(1-1.0*tcount/len(testlist)))

# #模型读取测试数据
# tcount=0
# for k in range(len(testlist)):
#     xset = np.array(testlist[k])
#     nptresult= np.array(testresult[k])
#     ly_y_predict= lr.predict(xset)
#     if ly_y_predict == nptresult:
#         continue
#     else:
#         tcount = tcount+1;
#         print("第几个{0}出错".format(k))
# print(tcount)
# print("采用sk测试数据集的正确率为{0}".format(1-1.0*tcount/len(testlist)))

损失函数下降图像:

测试数据集正确率:86%左右 。

可是用sklearn自己带的模型是 96%

囧。。。。想想办法刷刷数据,这个程序设计到 从读取CSV文件中随机的划分训练集和测试集合。通过计算出损失函数利用matplot绘图

时间: 2024-10-07 05:07:02

机器学习二 逻辑回归作业的相关文章

scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 import matplotlib matplotlib.rcParams['font.sans-serif']=[u'simHei'] matplotlib.rcParams['axes.unicode_minus']=False import pandas as pd import numpy as

机器学习二 逻辑回归

在生成模型中讲到了,可以利用手头的数据,假设数据是满足高斯分布,且是不同的均值,但是同一个协方差矩阵,基于贝叶斯的判别式,可以得到 p(c1|x)>0.5 是第一类   p(c1|x)可以转化为sigmod(z)=w*x +b

机器学习实战-逻辑回归

什么是回归? 假设现在有些数据点,我用直线对这些点进行拟合(该线叫做最佳拟合直线),这个拟合的过程就叫做回归. Logistic回归? 这里,Logistic回归进行分类的主要思想:根据现有数据对分类的边界线建立回归公式,以此边界线进行分类.这里的回归指的是最佳拟合,就是要找到边界线的回归公式的最佳拟合的参数集.训练时使用最优化算法寻找最佳拟合参数. 基于Logistic回归和Sigmoid函数的分类 对于边界线建立的回归函数,能够接受所有的输入然后预测出类别.例如,对于二分类的情况下,上述函数

机器学习之逻辑回归(二)

二项逻辑回归模型是如下的条件概率分布: 其中x∈是输入,y∈{0,1}是输出. 为了方便,将权值向量和输入向量进行扩充,此时w = ,x = ,回归模型表示如下: 参数w未知,采用统计学中的极大似然估计来由样本估计参数w.对于0-1分布x ~ B(1 , p),x的概率密度函数可以表示为: 其中k = 0或1. 构造极大似然函数: 取对数得: 同理对于二项逻辑回归,我们令: 则其似然函数为: 其中yi取值为0或1. 取对数得: 求上式的最大值等价于对上式取负号后的最小值问题,得: 问题就转换成了

机器学习:逻辑回归

************************************** 注:本系列博客是博主学习Stanford大学 Andrew Ng 教授的<机器学习>课程笔记.博主深感学过课程后,不进行总结很容易遗忘,根据课程加上自己对不明白问题的补充遂有此系列博客.本系列博客包括线性回归.逻辑回归.神经网络.机器学习的应用和系统设计.支持向量机.聚类.将维.异常检测.推荐系统及大规模机器学习等内容. ************************************** 逻辑回归 分类(C

机器学习 (三) 逻辑回归 Logistic Regression

文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人笔记,为我做个人学习笔记提供了很好的参考和榜样. § 3.  逻辑回归 Logistic Regression 1 分类Classification 首先引入了分类问题的概念——在分类(Classification)问题中,所需要预测的$y$是离散值.例如判断一封邮件是否属于垃圾邮件.判断一个在线交

【机器学习】逻辑回归(Logistic Regression)

注:最近开始学习<人工智能>选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索. 从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害(评价标准). 1. 什么是逻辑回归? 许多人对线性回归都比较熟悉,但知道逻辑回归的人可能就要少的多.从大的类别上来说,逻辑回归是一种有监督的统计学习方法,主要用于对样本进行分类. 在线性回归模型中,输出一般是连续的,例如$$y = f(x) = ax + b$$,对于每一个输入的x,都有一个对应的y输出.模

机器学习算法 --- 逻辑回归及梯度下降

一.逻辑回归简介 logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域. logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处. 其公式如下: 其图像如下: 我们通过观察上面的图像可以发现,逻辑回归的值域为(0, 1),当输入为0时,其输出为0.5:当输入小于0,并且越来越小时,其输出越来越接近于0:相反的,当其输入大于0,并且越来越大时,其输出越来

机器学习:逻辑回归(基础理解)

逻辑回归(Logistic Regression) 一.行业算法应用率 具统计,2017年,除了军事和安全领域,逻辑回归算法是在其它所有行业使用最多了一种机器学习算法: Logistic Regression(逻辑回归) Decision Trees(决策树) Random Forests(随机森林) Neural Networks(人工神经网络 NNs)--深度学习算法 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型