机器学习算法-LogisticRegression(逻辑回归)

一、原理

逻辑回归原理可参考:https://zhuanlan.zhihu.com/p/73608677

https://zhuanlan.zhihu.com/p/90520763两位大佬的

1、这里说下我自己的理解:首先逻辑回归建立在线性回归的基础上,但是由于线性回归预测出来的值可以是负无穷到正无穷的,要解决分类问题,通过一个类似于s形状的函数进行映射(也就是Sigmoid Function)一般用下面的这个函数映射:

其中的t就是线性回归的输出函数

2、逻辑回归的损失函数也不太一样,使用到了极大似然估计的知识,得出的损失函数如下h函数就是上面的S:

我理解的是:y(i)是真实值,就是把真实的y代入t算出来的概率,h(xi)是输入各个特征值,再代入求解,也就是预测值。

二、使用cv2.ml.LogisticRegression_create()函数

如果想了解详细的函数参数使用,请参考:https://blog.csdn.net/fengbingchun/article/details/78221693(感谢大佬)

一般来说opencv和c++结合使用,上面参考的博客就是使用C++,我这里给出的demo用的是Python+opencv

#逻辑回归对鸢尾花进行分类
import numpy as np
import cv2
from sklearn import datasets
from sklearn import model_selection
from sklearn import metrics
import matplotlib.pyplot as plt

#花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征
iris=datasets.load_iris()

# print(dir(iris)) #查看下数据集中有几部分组成(属性和方法)
# print(iris.DESCR) #数据集的一个说明
print(iris['feature_names'])
# print(iris.data.shape)
# print(iris.data)
print(iris.target_names)

#取出3类中的其中的2类,取前面2类
idx=iris.target!=2
data=iris.data[idx].astype(np.float32)
target=iris.target[idx].astype(np.float32)
#分别提取2类不同的花分开存放特征和标签
label0_idx=target!=1
data0=data[label0_idx].astype(np.float32)
target0=target[label0_idx].astype(np.float32)
#取后2类
label1_idx=target!=0
data1=data[label1_idx].astype(np.float32)
target1=target[label1_idx].astype(np.float32)

#画出2类不同花的花萼长宽数据散点图
plt.scatter(data0[:,0],data0[:,1],c='r',s=100)
plt.scatter(data1[:,0],data1[:,1],c='b',s=100)
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.show()

#划分训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(data,target,test_size=0.1,random_state=42)
#训练分类器
lr=cv2.ml.LogisticRegression_create()
lr.setTrainMethod(cv2.ml.LogisticRegression_MINI_BATCH)
lr.setMiniBatchSize(1)
lr.setIterations(100) #设置算法
lr.train(x_train,cv2.ml.ROW_SAMPLE,y_train)
# lr.train?
print(lr.get_learnt_thetas() )#获得权重系数
#测试分类器
x1_train,x1_test,y1_train,y1_test=model_selection.train_test_split(data,target,test_size=0.2,random_state=40)
ret,y1_pred=lr.predict(x1_test)
print(metrics.accuracy_score(y1_test,y1_pred)) #判断分类准确率的函数

结果:

三、使用sklearn.linear_model.LogisticRegression()的二分类

详细参数参考:https://blog.csdn.net/mrxjh/article/details/78499801(感谢翻译)

如果英文理解可以的话可以直接去官网API文档查阅

#逻辑回归对鸢尾花进行分类
import numpy as np
from sklearn import datasets
from sklearn import model_selection
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt

#花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征
iris=datasets.load_iris()

# print(dir(iris)) #查看下数据集中有几部分组成(属性和方法)
# print(iris.DESCR) #数据集的一个说明
print(iris['feature_names'])
# print(iris.data.shape)
# print(iris.data)
print(iris.target_names)

#取出3类中的其中的2类,取前面2类
idx=iris.target!=2
data=iris.data[idx]
target=iris.target[idx]

#划分训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(data,target,test_size=0.1,random_state=42)
#训练分类器
lr=LogisticRegression(random_state=10)
lr.fit(x_train,y_train)
#结果预测
y_predicted=lr.predict(x_test)
print('y_test:',y_test)
print('y_predicted:',y_predicted)
print('accuracy:',metrics.accuracy_score(y_test,y_predicted)*100,'%')

结果:

三、使用sklearn.linear_model.LogisticRegression()的多分类

我在是用的时候,其中参数multi_class:一个字符串,指定对于多分类问题的策略,两个策略我理解的还没透彻,但是可以进行多分类问题。

#逻辑回归对鸢尾花进行分类
import numpy as np
from sklearn import datasets
from sklearn import model_selection
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt

#花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征
iris=datasets.load_iris()

# print(dir(iris)) #查看下数据集中有几部分组成(属性和方法)
# print(iris.DESCR) #数据集的一个说明
print(iris['feature_names'])
# print(iris.data.shape)
# print(iris.data)
print(iris.target_names)

#取出3类
data=iris.data
target=iris.target

#划分训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(data,target,test_size=0.1,random_state=42)
#训练分类器
lr=LogisticRegression(random_state=10)
lr.fit(x_train,y_train)
#结果预测
y_predicted=lr.predict(x_test)
print('y_test:',y_test)
print('y_predicted:',y_predicted)
print('accuracy:',metrics.accuracy_score(y_test,y_predicted)*100,'%')

结果:

发布了53 篇原创文章 · 获赞 9 · 访问量 3247

猜你喜欢

转载自blog.csdn.net/weixin_41039168/article/details/104968415