首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分类问题咋解决?逻辑回归也可以梯度下降?

在这个世界上存在着很多这样的问题,例如判断某份邮件是不是垃圾邮件、某位病人的肿瘤是良性的还是恶性的。对于这类问题,我们称之为分类问题

( Classification) ,今天炸猪排给大家演示一下如何用逻辑回归(Logistic Regression)来解决分类问题。

“如果你是一所大学的行政管理人员,你想根据考生的两次考试成绩来决定他们能否被录取。你可以从之前的申请者那里获得可用作训练集的历史数据(包括申请人两次考试的成绩和录取与否)。我们要如何根据考试分数来估计该考生被录取的概率呢?”

首先,我们导入一些用于数据运算和绘制图表的Python包,

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

然后读取数据并使用散点图(Scatter)来显示学生们两次考试的成绩以及录取与否的数据,O代表录取,X代表不录取。

path = 'C:\machine learning\ex2data1.txt'

data = pd.read_csv(path,names=['Exam 1', 'Exam 2', 'Admitted'])

positive = data[data['Admitted'].isin([1])]

negative = data[data['Admitted'].isin([0])]

fig,ax = plt.subplots(figsize=(12,8))

ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='s', label='Admitted')

ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted')

ax.legend()

ax.set_xlabel('Exam 1 Score')

ax.set_ylabel('Exam 2 Score')

plt.show()

从这个图中我们可以看到分类的边界有点接近线性,不过它有点弯曲,所以我们不能够用直线完全精确地分类所有数据,但是我们可以非常接近。 现在我们需要实施逻辑回归,所以我们可以训练一个模型来找到最优的决策边界并进行类别预测。 第一步是引入sigmoid函数,这个函数是逻辑回归输出的“激活”(activation)函数。 它将输入值转换为零和一个之间的值输出。 这个值可以理解为输入值被正确分类的概率。

def sigmoid(z):

return1/(1+np.exp(-z))

下一步是建立Cost Function函数。

def cost(theta,X,y):

theta = np.matrix(theta)

X = np.matrix(X)

y = np.matrix(y)

first = np.multiply(-y, np.log(sigmoid(X * theta.T)))

second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))

return np.sum(first - second) / (len(X))

我们按照第一期的方法得到X,y, theta矩阵。

data.insert(0, 'Ones', 1)

cols = data.shape[1]

X = data.iloc[:,0:cols-1]

y = data.iloc[:,cols-1:cols]

X = np.matrix(X.values)

y = np.matrix(y.values)

theta = np.zeros(3)

X.shape,y.shape,theta.shape

现在我们可以试试我们的Cost Function。先将参数theta初始化为0,看看这个函数能否运行。

Cost(X, y, theta)

按照第一期的方法来对这个Cost Function执行梯度下降(Gradient Descent)从而使解决方案更接近最佳解决方案(即最佳拟合)。

def gradientDescent(X, y, theta, alpha, iters):

theta = np.matrix(theta)

X = np.matrix(X)

y = np.matrix(y)

parameters = int(theta.ravel().shape[1])

grad = np.zeros(parameters)

error = sigmoid(X*theta.T) - y

for i in range(parameters):

term = np.multiply(error, X[:,i])

grad[i] = np.sum(term) / len(X)

return grad

我们现在有了拟合数据集的最佳模型参数,只要输入某学生的两次成绩,这个模型就会输出“录取”或“不录取”的结果。 接下来,我们需要建立一个函数,使用我们拟合的参数theta输出数据集X的预测结果。 然后我们可以使用这个函数来评价分类器的精度。

import scipy.optimize as opt

result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))

cost(result[0], X, y)

def predict(theta, X):

probability = sigmoid(X * theta.T)

return [1 if x >= 0.5 else 0 for x in probability]

theta_min = np.matrix(result[0])

predictions = predict(theta_min, X)

correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]

accuracy = (sum(map(int, correct)) % len(correct))

print('accuracy = %'.format(accuracy))

运行结果如下截图

运行结果已经有了,炸猪排又有了一个大胆的想法,如果我们在这个例子里应用正则化会提高分类的精确性还是降低呢?除了回归法还有没有其他方法来对事物进行分类呢,之后炸猪排会给大家揭晓,大家拭目以待~~~

炸猪排

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180126G0VOA900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券