基于sklearn的LogisticRegression鸢尾花多类分类实践

文章目录

    • 1. 问题描述
    • 2. 数据介绍
      • 2.1 数据描述
      • 2.2 数据
      • 2.3 数据可视化
    • 3. 模型选择
      • 3.1 固有的多类分类器
      • 3.2 1对多的多类分类器
      • 3.3 OneVsRestClassifier
      • 3.4 OneVsOneClassifier
    • 4. 结果分析
    • 5. 附完整代码

在这里插入图片描述

鸢尾花(拼音:yuān wěi huā)又名:蓝蝴蝶、紫蝴蝶、扁竹花等,鸢尾属约300种,原产于中国中部及日本,是法国的国花。鸢尾花主要色彩为蓝紫色,有“蓝色妖姬”的美誉,鸢尾花因花瓣形如鸢鸟尾巴而称之,有蓝、紫、黄、白、红等颜色,英文irises音译俗称为“爱丽丝”

本文使用sklearn的逻辑斯谛回归模型,进行鸢尾花多分类预测,对OvR与OvO多分类方法下的预测结果进行对比。

1. 问题描述

  • 给定鸢尾花的特征数据集(花萼、花瓣的长和宽尺寸)
  • 预测其属于哪个品种(Setosa,Versicolor,Virginica)

2. 数据介绍

from sklearn import datasets
iris = datasets.load_iris()
print(dir(iris))    # 查看data所具有的属性或方法
# ['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']

我们看见数据有很多属性或方法,我们依次来看一看:

2.1 数据描述

print(iris.DESCR)   # 数据描述
  • 数据包含150个(每个类型的花50个)
  • 每个数据里有4个花的尺寸信息(花萼、花瓣的长宽)以及其分类class
  • 描述里给出了4种尺寸信息的(分布区间,均值,方差,分类相关系数)
  • 数据是否缺失某些值,作者,日期,来源,数据应用,参考文献
.. _iris_dataset:Iris plants dataset
--------------------**Data Set Characteristics:**:Number of Instances: 150 (50 in each of three classes):Number of Attributes: 4 numeric, predictive attributes and the class:Attribute Information:- sepal length in cm- sepal width in cm- petal length in cm- petal width in cm- class:- Iris-Setosa- Iris-Versicolour- Iris-Virginica:Summary Statistics:============== ==== ==== ======= ===== ====================Min  Max   Mean    SD   Class Correlation============== ==== ==== ======= ===== ====================sepal length:   4.3  7.9   5.84   0.83    0.7826sepal width:    2.0  4.4   3.05   0.43   -0.4194petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)============== ==== ==== ======= ===== ====================:Missing Attribute Values: None:Class Distribution: 33.3% for each of 3 classes.:Creator: R.A. Fisher:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov):Date: July, 1988The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.This is perhaps the best known database to be found in the
pattern recognition literature.  Fisher's paper is a classic in the field and
is referenced frequently to this day.  (See Duda & Hart, for example.)  The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant.  One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other... topic:: References- Fisher, R.A. "The use of multiple measurements in taxonomic problems"Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions toMathematical Statistics" (John Wiley, NY, 1950).- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.(Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.- Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New SystemStructure and Classification Rule for Recognition in Partially ExposedEnvironments".  IEEE Transactions on Pattern Analysis and MachineIntelligence, Vol. PAMI-2, No. 1, 67-71.- Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactionson Information Theory, May 1972, 431-433.- See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS IIconceptual clustering system finds 3 classes in the data.- Many, many more ...

2.2 数据

print(iris.data)	# 特征数据
# 150行4列 <class 'numpy.ndarray'>
print(iris.feature_names)	# 特征名称
# ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print(iris.filename)	# 文件路径
C:\Users\***\AppData\Roaming\Python\Python37\site-packages\sklearn\datasets\data\iris.csv
print(iris.target)	# 分类标签 size 150
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2]
print(iris.target_names)	# 分类名称 3类 花的名称
# ['setosa' 'versicolor' 'virginica']

2.3 数据可视化

由于平面只能展示2维特征,我们取2个特征进行进行观看。

def show_data_set(X, y, data):plt.plot(X[y == 0, 0], X[y == 0, 1], 'rs', label=data.target_names[0])plt.plot(X[y == 1, 0], X[y == 1, 1], 'bx', label=data.target_names[1])plt.plot(X[y == 2, 0], X[y == 2, 1], 'go', label=data.target_names[2])plt.xlabel(data.feature_names[0])plt.ylabel(data.feature_names[1])plt.title("鸢尾花2维数据")plt.legend()plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码plt.show()
iris = datasets.load_iris()
# print(dir(iris))    # 查看data所具有的属性或方法
# print(iris.data)    # 数据
# print(iris.DESCR)   # 数据描述
X = iris.data[:, :2]  # 取前2列特征sepal(平面只能展示2维)
# X = iris.data[:, 2:4]   # petal两个特征
# X = iris.data  # 全部4个特征
y = iris.target  # 分类
show_data_set(X, y, iris)

在这里插入图片描述
在这里插入图片描述

3. 模型选择

本人相关文章:

  • 逻辑斯谛回归模型( Logistic Regression,LR)
  • 基于sklearn的LogisticRegression二分类实践

sklearn多类和多标签算法:

  • Multiclass classification 多类分类 意味着一个分类任务需要对多于两个类的数据进行分类。比如,对一系列的橘子,苹果或者梨的图片进行分类。多类分类假设每一个样本有且仅有一个标签:一个水果可以被归类为苹果,也可以是梨,但不能同时被归类为两类。

  • 固有的多类分类器:
    sklearn.linear_model.LogisticRegression (setting multi_class=”multinomial”)

  • 1对多的多类分类器:
    sklearn.linear_model.LogisticRegression (setting multi_class=”ovr”)

分类器Classifier方法:

  • One-vs-the-rest (OvR),也叫 one-vs-all,1对多, 在 OneVsRestClassifier 模块中执行。 这个方法在于每一个类都将用一个分类器进行拟合。 对于每一个分类器,该类将会和其他所有的类有所区别。除了它的计算效率之外 (只需要 n_classes 个分类器), 这种方法的优点是它具有可解释性。 因为每一个类都可以通过有且仅有一个分类器来代表,所以通过检查一个类相关的分类器就可以获得该类的信息。这是最常用的方法,也是一个合理的默认选择。

  • One-vs-one (OvO),OneVsOneClassifier 1对1分类器 将会为每一对类别构造出一个分类器,在预测阶段,收到最多投票的类别将会被挑选出来。 当存在结时(两个类具有同样的票数的时候), 1对1分类器会选择总分类置信度最高的类,其中总分类置信度是由下层的二元分类器 计算出的成对置信等级累加而成。
    因为这需要训练出 n_classes * (n_classes - 1) / 2 个分类器, 由于复杂度为 O(n_classes^2),这个方法通常比 one-vs-the-rest 慢。然而,这个方法也有优点,比如说是在没有很好的缩放 n_samples 数据的核方法中。 这是由于每个单独的学习问题只涉及一小部分数据,而 one-vs-the-rest 将会使用 n_classes 次完整的数据。OvO准确率会比OvR高。

3.1 固有的多类分类器

  • sklearn.linear_model.LogisticRegression (setting multi_class=”multinomial”)

相关multiclass参数选择的help说明:

In the multiclass case, the training algorithm uses the one-vs-rest (OvR) scheme if the ‘multi_class’ option is set to ‘ovr’,
and uses the cross-entropy loss if the ‘multi_class’ option is set to ‘multinomial’. (Currently the ‘multinomial’ option is supported only by the ‘lbfgs’, ‘sag’, ‘saga’ and ‘newton-cg’ solvers.)

multi_class : {‘auto’, ‘ovr’, ‘multinomial’}, default=‘auto’
If the option chosen is ‘ovr’, then a binary problem is fit for each label.
For ‘multinomial’ the loss minimised is the multinomial loss fit across the entire probability distribution, even when the data is binary.
‘multinomial’ is unavailable when solver=‘liblinear’.
‘auto’ selects ‘ovr’ if the data is binary, or if solver=‘liblinear’, and otherwise selects ‘multinomial’.

直接设置LogisticRegression的参数:multi_class='multinomial', solver='newton-cg',代码如下:

def test1(X_train, X_test, y_train, y_test, multi_class='multinomial', solver='newton-cg'):log_reg = LogisticRegression(multi_class=multi_class, solver=solver)  # 调用multinomial多分类,求解器 newton-cg or lbfgslog_reg.fit(X_train, y_train)predict_train = log_reg.predict(X_train)sys.stdout.write("LR(multi_class = %s, solver = %s) Train Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_train, predict_train)))predict_test = log_reg.predict(X_test)sys.stdout.write("LR(multi_class = %s, solver = %s) Test  Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: log_reg.predict(x)) # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: log_reg.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)

3.2 1对多的多类分类器

  • sklearn.linear_model.LogisticRegression (setting multi_class=”ovr”)

直接设置LogisticRegression的参数:multi_class='ovr', solver='liblinear'',代码如下:

def test1(X_train, X_test, y_train, y_test, multi_class='ovr', solver='liblinear'):log_reg = LogisticRegression(multi_class=multi_class, solver=solver)  # 调用ovr多分类,设置求解器 liblinearlog_reg.fit(X_train, y_train)predict_train = log_reg.predict(X_train)sys.stdout.write("LR(multi_class = %s, solver = %s) Train Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_train, predict_train)))predict_test = log_reg.predict(X_test)sys.stdout.write("LR(multi_class = %s, solver = %s) Test  Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: log_reg.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: log_reg.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)

3.3 OneVsRestClassifier

class sklearn.multiclass.OneVsRestClassifier(estimator, n_jobs=None)

分类器接受一个评估器estimator对象,先定义一个LR模型log_reg,将log_reg传入OvR分类器 ovr = OneVsRestClassifier(log_reg)

def test2(X_train, X_test, y_train, y_test):#  multi_class默认auto# 'auto' selects 'ovr' if the data is binary, or if solver='liblinear',#  and otherwise selects 'multinomial'.#  看完help知道auto选择的是ovr,因为下面求解器选的是 liblinear#  所以test1和test2是同种效果,不一样的写法log_reg = LogisticRegression(solver='liblinear')ovr = OneVsRestClassifier(log_reg)	# 传入LR至OvR分类器ovr.fit(X_train, y_train)predict_train = ovr.predict(X_train)sys.stdout.write("LR(ovr) Train Accuracy : %.4g\n" % (metrics.accuracy_score(y_train, predict_train)))predict_test = ovr.predict(X_test)sys.stdout.write("LR(ovr) Test  Accuracy : %.4g\n" % (metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: ovr.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: ovr.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)

3.4 OneVsOneClassifier

class sklearn.multiclass.OneVsOneClassifier(estimator, n_jobs=None)

分类器接受一个评估器estimator对象,先定义一个LR模型log_reg,将log_reg传入OvO分类器 ovo = OneVsOneClassifier(log_reg)

def test3(X_train, X_test, y_train, y_test):# For multiclass problems, only 'newton-cg', 'sag', 'saga' and 'lbfgs' handle multinomial loss;log_reg = LogisticRegression(multi_class='multinomial', solver='newton-cg')# ovo多分类,传入LR(multinomial,newton-cg or lbfgs),测试时,选择multi_class='ovr',结果一致,谁帮忙解释下ovo = OneVsOneClassifier(log_reg)  ovo.fit(X_train, y_train)predict_train = ovo.predict(X_train)sys.stdout.write("LR(ovo) Train Accuracy : %.4g\n" % (metrics.accuracy_score(y_train, predict_train)))predict_test = ovo.predict(X_test)sys.stdout.write("LR(ovo) Test  Accuracy : %.4g\n" % (metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: ovr.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: ovr.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)

4. 结果分析

执行预测:

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=777)  # 默认test比例0.25
test1(X_train, X_test, y_train, y_test, multi_class='ovr', solver='liblinear')
test2(X_train, X_test, y_train, y_test)
test1(X_train, X_test, y_train, y_test, multi_class='multinomial', solver='newton-cg')
test3(X_train, X_test, y_train, y_test)
参数\分类模式dataLR(ovr, liblinear) 调用ovrOvR分类器(传入LR(liblinear))LR(multinomial, newton-cg)OvO分类器(传入LR(multinomial, newton-cg))
seed(520), 2 features [sepal, L,W]在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率:train / test0.7679,0.84210.7679,0.84210.7768,0.89470.7768,0.8684
seed(777), 2 features [sepal, L,W]在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率:train / test0.7589,0.73680.7589,0.73680.7768,0.81580.7946,0.8158
seed(520), 2 features [petal, L,W]在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率:train / test0.8750,0.94740.8750,0.94740.9554,10.9554,1
seed(777), 2 features [petal, L,W]在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率:train / test0.9196,0.94740.9196,0.94740.9554,10.9554,1
seed(520), 4 features-----
准确率:train / test0.9464,10.9464,10.9643,10.9732,1
seed(777), 4 features-----
准确率:train / test0.9464,10.9464,10.9643,10.9732,1
  • 前两列是OvR模式的多分类,代码写法有区别,预测结果完全一样
  • 后两列是OvO模式的多分类(sklearn里没有提供 LR 内置的'ovo'选项)
  • 对比两种模式的多分类预测效果,OvO比OvR要好,但OvO是 O(n2)的复杂度
  • 在以sepal的长宽为特征的预测中,2维分类线可见setosa与剩余2类线性可分,剩余两类之间线性不可分
  • 在以petal的长宽为特征的预测相比于sepal的两个特征预测,petal的预测准确率高,由图也可看出,分界线较好的区分了3个种类
  • 在使用4维特征下进行预测,训练准确率OvO比OvR要好,测试准确率均达到100%,使用4维特征比使用2维特征预测,4维特征预测准确率更高

对于上面OvR,OvO分类器传入的 LR 模型(里面的参数该怎么填写),在上表的基础上做了如下测试:(如果有大佬看见这里,请赐教!)

    OvR分类器(传入LR(ovr,liblinear)) 
增加 OvR分类器(传入LR(multinomial, newton-cg)) 
-------------------------------------------------OvO分类器(传入LR(multinomial, newton-cg))
增加 OvO分类器(传入LR(ovr,liblinear))
参数/准确率train, testLR(ovr, liblinear) 调用ovrOvR分类器(传入LR(ovr,liblinear))OvR分类器(传入LR(multinomial, newton-cg))LR(multinomial, newton-cg)OvO分类器(传入LR(multinomial, newton-cg))OvO分类器(传入LR(ovr,liblinear))
seed(520), 2 features [sepal, L,W]0.7679,0.84210.7679,0.84210.7857,0.89470.7768,0.89470.7768,0.86840.7500,07105
seed(777), 2 features [sepal, L,W]0.7589,0.73680.7589,0.73680.7589,0.81580.7768,0.81580.7946,0.81580.7232,0.7105
seed(520), 2 features [petal, L,W]0.8750,0.94740.8750,0.94740.9375,10.9554,10.9554,10.9464,1
seed(777), 2 features [petal, L,W]0.9196,0.94740.9196,0.94740.9464,10.9554,10.9554,10.9554,0.9737
seed(520), 4 features0.9464,10.9464,10.9464,10.9643,10.9732,10.9732,1
seed(777), 4 features0.9464,10.9464,10.9464,10.9643,10.9732,10.9821,0.9737
    OvR分类器(传入LR(ovr,liblinear)) 
增加 OvR分类器(传入LR(multinomial, newton-cg)) # OvR 该参数下效果更好
-------------------------------------------------OvO分类器(传入LR(multinomial, newton-cg)) # OvO 该参数下效果更好
增加 OvO分类器(传入LR(ovr,liblinear))	

根据上面的数据,个人妄自推测:

  • 可能大部分情况下,OvR < OvO,LR(‘ovr’) < LR(‘multinomial’)
  • 搭配起来呢,所以同一OvR或者OvO下,传入LR(‘multinomial’)预测结果准确率更高

这块还请大佬指点迷津!!!

5. 附完整代码

'''遇到不熟悉的库、模块、类、函数,可以依次:1)百度(google确实靠谱一些),如"matplotlib.pyplot",会有不错的博客供学习参考2)"终端-->python-->import xx-->help(xx.yy)",一开始的时候这么做没啥用,但作为资深工程师是必备技能3)试着修改一些参数,观察其输出的变化,在后面的程序中,会不断的演示这种办法
'''
# written by hitskyer, I just wanna say thank you !
# modified by Michael Ming on 2020.2.20
# Python 3.7
import sys
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.multiclass import OneVsOneClassifierdef show_data_set(X, y, data):plt.plot(X[y == 0, 0], X[y == 0, 1], 'rs', label=data.target_names[0])plt.plot(X[y == 1, 0], X[y == 1, 1], 'bx', label=data.target_names[1])plt.plot(X[y == 2, 0], X[y == 2, 1], 'go', label=data.target_names[2])plt.xlabel(data.feature_names[0])plt.ylabel(data.feature_names[1])plt.title("鸢尾花2维数据")plt.legend()plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码plt.show()def plot_data(X, y):plt.plot(X[y == 0, 0], X[y == 0, 1], 'rs', label='setosa')plt.plot(X[y == 1, 0], X[y == 1, 1], 'bx', label='versicolor')plt.plot(X[y == 2, 0], X[y == 2, 1], 'go', label='virginica')plt.xlabel("sepal length (cm)")plt.ylabel("sepal width (cm)")# plt.xlabel("petal length (cm)")# plt.ylabel("petal width (cm)")plt.title("预测分类边界")plt.legend()plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码plt.show()def plot_decision_boundary(x_min, x_max, y_min, y_max, pred_func):h = 0.01xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z = pred_func(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)def test1(X_train, X_test, y_train, y_test, multi_class='ovr', solver='liblinear'):log_reg = LogisticRegression(multi_class=multi_class, solver=solver)  # 调用ovr多分类log_reg.fit(X_train, y_train)predict_train = log_reg.predict(X_train)sys.stdout.write("LR(multi_class = %s, solver = %s) Train Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_train, predict_train)))predict_test = log_reg.predict(X_test)sys.stdout.write("LR(multi_class = %s, solver = %s) Test  Accuracy : %.4g\n" % (multi_class, solver, metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: log_reg.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: log_reg.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)def test2(X_train, X_test, y_train, y_test):#  multi_class默认auto# 'auto' selects 'ovr' if the data is binary, or if solver='liblinear',#  and otherwise selects 'multinomial'.#  看完help知道auto选择的是ovr,因为下面求解器选的是 liblinear#  所以test1和test2是同种效果,不一样的写法log_reg = LogisticRegression(solver='liblinear')ovr = OneVsRestClassifier(log_reg)ovr.fit(X_train, y_train)predict_train = ovr.predict(X_train)sys.stdout.write("LR(ovr) Train Accuracy : %.4g\n" % (metrics.accuracy_score(y_train, predict_train)))predict_test = ovr.predict(X_test)sys.stdout.write("LR(ovr) Test  Accuracy : %.4g\n" % (metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: ovr.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: ovr.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)def test3(X_train, X_test, y_train, y_test):# For multiclass problems, only 'newton-cg', 'sag', 'saga' and 'lbfgs' handle multinomial loss;log_reg = LogisticRegression(multi_class='multinomial', solver='newton-cg')ovo = OneVsOneClassifier(log_reg)  # ovo多分类,传入LR(multinomial,newton-cg or lbfgs)ovo.fit(X_train, y_train)predict_train = ovo.predict(X_train)sys.stdout.write("LR(ovo) Train Accuracy : %.4g\n" % (metrics.accuracy_score(y_train, predict_train)))predict_test = ovo.predict(X_test)sys.stdout.write("LR(ovo) Test  Accuracy : %.4g\n" % (metrics.accuracy_score(y_test, predict_test)))plot_decision_boundary(4, 8.5, 1.5, 4.5, lambda x: ovo.predict(x))  # 4个特征下注释掉,前两特征# plot_decision_boundary(0.5, 7.5, 0, 3, lambda x: ovo.predict(x))  # 4个特征下注释掉,后两特征plot_data(X_train, y_train)if __name__ == '__main__':iris = datasets.load_iris()# print(dir(iris))    # 查看data所具有的属性或方法# print(iris.data)    # 数据# print(iris.DESCR)   # 数据描述X = iris.data[:, :2]  # 取前2列特征sepal(平面只能展示2维)# X = iris.data[:, 2:4]   # petal两个特征# X = iris.data  # 全部4个特征y = iris.target  # 分类show_data_set(X, y, iris)X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=777)  # 默认test比例0.25test1(X_train, X_test, y_train, y_test, multi_class='ovr', solver='liblinear')test2(X_train, X_test, y_train, y_test)test1(X_train, X_test, y_train, y_test, multi_class='multinomial', solver='newton-cg')test3(X_train, X_test, y_train, y_test)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMU 提出全新 GAN 结构,GAN 自此迈入预训练大军!

文&#xff5c;林锐众所周知&#xff0c;现在 GAN 的应用是越来越宽泛了&#xff0c;尤其是在 CV 领域。不仅可以调个接口生成新头像图一乐&#xff0c;也可以用 GAN 做数据增强让模型更加健壮。▲嘉然你带我走吧嘉然&#xff01;在CV领域&#xff0c;不像分类、目标检测等任务…

在传统Spring应用中使用spring-boot-actuator模块提供监控端点

在之前发布的《Spring Boot Actuator监控端点小结》一文中&#xff0c;我们介绍了Spring Boot Actuator模块为应用提供的强大监控能力。在Spring Boot应用中&#xff0c;我们只需要简单的引入spring-boot-starter-actuator依赖就能为应用添加各种有用的监控端点。其中&#xff…

剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)

1. 题目 输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组&#xff0c;但里面不能有重复元素。 示例: 输入&#xff1a;s "abc" 输出&#xff1a;["abc","acb","bac","bca&q…

我手撸了一个乞丐版深度学习框架,已开源!

文 | 王桂波知乎源 | 极市平台当前深度学习框架越来越成熟&#xff0c;对于使用者而言封装程度越来越高&#xff0c;好处就是现在可以非常快速地将这些框架作为工具使用&#xff0c;用非常少的代码就可以构建模型进行实验&#xff0c;坏处就是可能背后地实现都被隐藏起来了。在…

使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

在之前的所有Spring Boot和Spring Cloud相关博文中&#xff0c;都会涉及Spring Boot工程的创建。而创建的方式多种多样&#xff0c;我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建&#xff0c;也可以通过《Spring Boot快速入门》一文中提到的SPRING INITIALIZR页面工…

剑指Offer - 面试题61. 扑克牌中的顺子

1. 题目 从扑克牌中随机抽5张牌&#xff0c;判断是不是一个顺子&#xff0c;即这5张牌是不是连续的。2&#xff5e;10为数字本身&#xff0c;A为1&#xff0c;J为11&#xff0c;Q为12&#xff0c;K为13&#xff0c;而大、小王为 0 &#xff0c;可以看成任意数字。A 不能视为 1…

超越CLIP!谷歌发布首个大规模MoE架构的视觉语言模型

文 | 明敏&#xff08;发自凹非寺&#xff09;源 | 量子位多模态模型常见&#xff0c;但是基于稀疏化的还是头一个。谷歌带来最新成果LIMoE&#xff0c;首次将稀疏化方法用在了图像文本混合模型上。要知道&#xff0c;随着大模型参数呈指数级增加&#xff0c;训练成本也是一路飙…

新年彩蛋:Spring Boot自定义Banner

在2016年的最后一天&#xff0c;借用Spring Boot的Banner向各位程序猿同仁们问候一声&#xff1a;Happy New Year。 接下来我们就来介绍一下这个轻松愉快的自定义banner功能。实现的方式非常简单&#xff0c;我们只需要在Spring Boot工程的/src/main/resources目录下创建一个ba…

剑指Offer - 面试题58 - II. 左旋转字符串

1. 题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如&#xff0c;输入字符串"abcdefg"和数字2&#xff0c;该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1&#xff1a; 输入…

硬刚Meta!字节把元宇宙跳动到了美国

文 | 好困 拉燕源 | 新智元字节跳动招兵买马&#xff0c;组队「杀向」西海岸。如今元宇宙火得一塌糊涂&#xff0c;跟互联网挂钩的公司都想来掺一脚。最近&#xff0c;就连字节跳动也要进军元宇宙了&#xff01;你给我等等&#xff0c;这是什么陈年旧闻&#xff1f;别急&#x…

Spring Boot应用的后台运行配置

酱油一篇&#xff0c;整理一下关于Spring Boot后台运行的一些配置方式。在介绍后台运行配置之前&#xff0c;我们先回顾一下Spring Boot应用的几种运行方式&#xff1a; 运行Spring Boot的应用主类使用Maven的Spring Boot插件mvn spring-boot:run来运行打成jar包后&#xff0c…

Spring Boot Actuator监控端点小结

在Spring Boot的众多Starter POMs中有一个特殊的模块&#xff0c;它不同于其他模块那样大多用于开发业务功能或是连接一些其他外部资源。它完全是一个用于暴露自身信息的模块&#xff0c;所以很明显&#xff0c;它的主要作用是用于监控与管理&#xff0c;它就是&#xff1a;spr…

剑指Offer - 面试题60. n个骰子的点数(动态规划)

1. 题目 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案&#xff0c;其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 示例 1: 输入: 1 输出…

经典著作《动手学深度学习》中文版2.0beta版发布!开源下载!

2020年疫情刚开始的时候&#xff0c;《动手学深度学习》的英文版相较中文版已经多出不少内容了。我们书第一版的不少老读者表示&#xff0c;疫情在家虽然想学习&#xff0c;但第一版早就刷完&#xff0c;于是只好刷阿信和小抖。沐神和我的第一反应是&#xff1a;这样对眼睛不好…

使用Spring StateMachine框架实现状态机

Spring StateMachine框架可能对于大部分使用Spring的开发者来说还比较生僻&#xff0c;该框架目前差不多也才刚满一岁多。它的主要功能是帮助开发者简化状态机的开发过程&#xff0c;让状态机结构更加层次化。前几天刚刚发布了它的第三个Release版本1.2.0&#xff0c;其中增加了…

滴滴退市了

文 | 彭小伟, 编 | 刘芳源 | 网约车焦点美东时间6月10日&#xff0c;滴滴正式在纽交所退市。根据官方通告&#xff0c;滴滴在完成退市后&#xff0c;其股份会转移到OTC&#xff08;Over-the-Counter&#xff0c;场外交易市场&#xff09;进行交易&#xff0c;交易代码为“DIDIY…

剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)

1. 题目 0,1,…,n-1这n个数字排成一个圆圈&#xff0c;从数字0开始&#xff0c;每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如&#xff0c;0、1、2、3、4这5个数字组成一个圆圈&#xff0c;从数字0开始每次删除第3个数字&#xff0c;则删除的前4个…

Spring Boot中使用MyBatis注解配置详解

之前在Spring Boot中整合MyBatis时&#xff0c;采用了注解的配置方式&#xff0c;相信很多人还是比较喜欢这种优雅的方式的&#xff0c;也收到不少读者朋友的反馈和问题&#xff0c;主要集中于针对各种场景下注解如何使用&#xff0c;下面就对几种常见的情况举例说明用法。 在…

何恺明团队的“视频版本MAE”,高效视频预训练!Mask Ratio高达90%时效果也很好!...

文 | 小马源 | 我爱计算机视觉本篇文章分享论文『Masked Autoencoders As Spatiotemporal Learners』&#xff0c;由何恺明团队提出视频版本的 MAE&#xff0c;进行高效视频预训练&#xff01;Mask Ratio 高达 90% 时效果很好&#xff01;详细信息如下&#xff1a;论文链接&…

剑指Offer - 面试题45. 把数组排成最小的数(字符串排序)

1. 题目 输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102"示例 2: 输入: [3,30,34,5,9] 输出: "3033459"提示: 0 < nums.length < 100 说明…