逻辑回归实现癌症预测(无框架实现)

数据获取

数据获取链接
选择breast-cancer-wisconsin.data可以右键另存为data.csv
或者python代码在线获取
pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")
本文采用另存为方式方便处理

处理数据

首先看数据格式数据格式说明

总共有699个样本数据,其中16个数据缺失,利用?代替

每行数据有11个特征,第一个为id number,最后一个为class(有无癌症的分类),所以真正用于训练的特征值有9个

处理步骤

  • 读取csv文件
  • 将?替换为标准缺失值表示
  • 去掉所有有缺失值的样本,剩余683条数据
  • 将前500条提取作为训练集
  • 将后183条提取作为测试集

代码

#处理数据,删除缺失值,分离训练集和测试集
def deal_data():    
    column_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape',
                'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin',
                'Normal Nucleoli','Mitoses','Class'
                ]
    data = pd.read_csv("cancer/data.csv")
    data = data.replace(to_replace='?',value=np.nan)
    #去掉缺失值
    data = data.dropna(how='any')
    #读取前500行为训练集,不要索引和表头
    data.head(500).to_csv('train.csv',index=False,header=column_names)
    #读取后183行为测试集,不要索引和表头
    data.tail(183).to_csv('test.csv',index=False,header=column_names)

因为Sigmoid函数输出值为(0,1),将calss这一列的2替换为0 ,4替换为1,可以在excel中完成,也可以用python代码。

读取数据

步骤

  • 读取train.csv文件
  • 在第二列插入一列1,为x0的值
  • 数据分离,dataMat为x矩阵,第二列到第十一列,共十列,并进行归一化处理
  • 数据分离,dataLab为y矩阵,第十二列

代码

def read_data():
    deal_data()
    dataMat=[]
    dataLab=[]
    b=np.ones(500)
    data_train=pd.read_csv("train.csv")
    #将DataFrame转化为矩阵
    train_data=data_train.as_matrix()
    #在第一列添加一个常数项,x0
    train_data = np.insert(train_data, 1, values=b, axis=1)
    #选取训练集
    dataMat = (train_data[:,1:11])/10
    #选取输出值
    dataLab = train_data[:,11:12]
    return dataMat,dataLab

训练数据

步骤

  • 将数据矩阵化处理

  • 设置学习率,迭代次数,权重初始值

  • 进入循环,Sigmoid函数求输出值,求误差,更新权重

  • 返回权重值

代码

def gradAscent(dataMat, labelMat): #梯度上升求最优参数
    dataMatrix=np.mat(dataMat) #将读取的数据转换为矩阵
    classLabels=np.mat(labelMat) #将读取的数据转换为矩阵
    m,n = np.shape(dataMat)
    alpha = 0.001  #设置梯度的阀值,该值越大梯度上升幅度越大  即学习率
    maxCycles = 200 #设置迭代的次数,一般看实际数据进行设定,有些可能200次就够了
    weights = np.mat((np.random.rand(10))).reshape(n,1) #设置初始的参数,赋值为一串随机数
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error =(classLabels - h)   #求差值
        weights = weights + alpha * dataMatrix.transpose()* error #迭代更新权重
        print(weights)
    print(weights)
    return weights

测试数据

步骤

  • 读取数据test.csv

  • 插入一列为1的数据

  • 利用训练的权重计算测试集的输出

  • 与原数据比较计算错误率

代码

def test_data(weigh):
    a=np.ones(183)
    testMat=[]
    data_test=pd.read_csv("test.csv")
    #将DataFrame转化为矩阵
    data_test=data_test.as_matrix()
    #在第一列添加一个常数项
    data_test = np.insert(data_test, 1, values=a, axis=1)
    #选取训练集
    testMat = (data_test[:,1:11])/10
    testLab = data_test[:,11:12]
    testMat=np.mat(testMat)
    h=sigmoid(testMat*weigh)
    m=len(h)
    error = 0.0
    for i in range(m):
        if h[i]>0.5:
            print("判断为有癌症")
            if testLab[i] !=1:
                error += 1
        if h[i]<=0.5:
            print("判断为无癌症")
            if testLab[i] != 0:
                error+=1
    print(error/m)

结果

训练结果为0.027还比较满意。更改学习率和迭代次数可以得到不同的错误率。
逻辑回归实现癌症预测(无框架实现)_第1张图片








你可能感兴趣的:(机器学习,python,机器学习,逻辑回归,癌症预测)