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个
#处理数据,删除缺失值,分离训练集和测试集
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代码。
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还比较满意。更改学习率和迭代次数可以得到不同的错误率。