机器学习算法之_逻辑斯蒂回归(Logistics)

逻辑斯蒂回归虽然名字叫回归,但是其实分类, 而且这个分类很强大(以后工作是必须要用的(分类问题))

【关键词】Logistics函数,最大似然估计,梯度下降法

一.原理

利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理

1.实现步骤

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。

二、构造函数

1 构造预测函数
logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。首先需要先找到一个预测函数(h),显然,该函数的输出必须是两类值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为
2构造损失函数
Cost函数和J(θ)函数是基于最大似然估计推导得到的。
最大似然估计就是要求得使l(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数
3梯度下降法求J(θ)的最小值
求J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:

三、实战

sklearn.linear_model.LogisticRegression(penalty=‘l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=‘liblinear’, max_iter=100, multi_class=‘ovr’, verbose=0, warm_start=False, n_jobs=1)

solver参数的选择:

“liblinear”:小数量级的数据集 “lbfgs”,
“sag” or “newton-cg”:大数量级的数据集以及多分类问题
“sag”:极大的数据集

1.手写数字数据集的分类

使用KNN与Logistic回归两种方法

# 导包
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
import sklearn.datasets as datasets
import matplotlib.pyplot as plt
%matplotlib inline
#导入数据load_digits()
digits = datasets.load_digits()
digits
data = digits.data
data.shape

images = digits.images
images.shape

plt.imshow(images[0], cmap = "gray")
data[0].shape

plt.imshow(data[0].reshape(8,8), cmap = "gray")


target = digits.target

from sklearn.model_selection import train_test_split
X_train, X_test,y_train,y_test = train_test_split(data, target, test_size = 0.02)

#创建模型,训练和预测
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
knn.score(X_test,y_test)

logic = LogisticRegression()
logic.fit(X_train,y_train)
logic.score(X_test,y_test)

2.使用make_blobs产生数据集进行分类

导包使用datasets.make_blobs创建一系列点

#make_blobs是专门画三簇点的
data, target = datasets.make_blobs(n_samples=150)
data.shape
target
plt.scatter(data[:,0],data[:,1], c = target)

#创建机器学习模型,训练数据
logic = LogisticRegression()
logic.fit(data, target)

import numpy as np

#预测数据
xmin, xmax =  data[:,0].min(), data[:,0].max()
ymin, ymax = data[:,1].min(), data[:,1].max()
x = np.linspace(xmin, xmax, 500)
y = np.linspace(ymin, ymax, 300)
xx, yy = np.meshgrid(x,y)
x_test = np.c_[xx.ravel(), yy.ravel()]
x_test.shape

#预测坐标点数据,并进行reshape()

#对数据进行预测
y_=  logic.predict(x_test)


#绘制图形
xx.shape
y_.shape

plt.figure(figsize=(12,9))
#plt.scatter(xx, x_test[:,1], c = y_)
#对坐标点进行着色
plt.pcolormesh(xx, yy,y_.reshape(xx.shape))
plt.scatter(data[:,0], data[:,1], c = target, cmap = "rainbow")
发布了388 篇原创文章 · 获赞 71 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/103975335