day4-分类问题(相关案例代码理解分享)

day4-分类问题(相关案例代码理解分享)


心得体会

开源学习组织datawhale的组队学习第四天,使用sklearn构建完整的分类项目,回顾了机器学习中的一些分类模型,也实践了相关模型的调用代码,对所有的代码都加了自己的注释与理解,完成了布置的作业任务,在这里感谢datawhale开源社区的小伙伴们给予的学习帮助,今后的学习也要一样加油呀

提示:以下是本篇文章正文内容,下面案例以及设计到的知识点均为datawhale开源组织提供

思维导图:
在这里插入图片描述

前言

一、使用sklearn构建完整的分类项目

1、收集数据集并选择合适的特征

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
feature = iris.feature_names
data = pd.DataFrame(X,columns=feature)
data['target'] = y
data.head()

2、选择度量模型性能的指标

  • 真阳性TP:预测值和真实值都为正例;

  • 真阴性TN:预测值与真实值都为正例;

  • 假阳性FP:预测值为正,实际值为负;

  • 假阴性FN:预测值为负,实际值为正;
    在这里插入图片描述

  • 准确率:分类正确的样本数占总样本的比例
    在这里插入图片描述

  • 精度:预测为正且分类正确的样本占预测值为正的比例
    在这里插入图片描述

  • 召回率:预测为正且分类正确的样本占类别为正的比例
    在这里插入图片描述

  • F1值:综合衡量精度和召回率
    在这里插入图片描述

  • ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。

3、选择具体的模型并进行训练

(1)逻辑回归logistic regression

我们假设逻辑回归模型为:
在这里插入图片描述
下面我们来具体推导下逻辑回归模型:
在这里插入图片描述
因为y只可能取0或者1,因此假设数据服从0-1分布,也叫伯努利分布,
在这里插入图片描述
可以带入y=0和y=1进去验证,结果和前面的结论一模一样。
我们使用极大似然估计MLE,即:
在这里插入图片描述
因此
在这里插入图片描述
由于这里涉及的函数不像线性回归一样能简单求出解析解,因此我们使用迭代的优化算法:梯度下降法,即:

在这里插入图片描述
值得注意的是,逻辑回归在实际中不太用于多分类问题,因为实际效果不是很好.

(2)基于概率的分类模型

(a) 线性判别分析

基于数据进行分类时,一个很自然的想法是:将高维的数据降维至一维,然后使用某个阈值将各个类别分开。下面用图的形式展示:
在这里插入图片描述
图中,数据的维度是二维的,我们的想法是把数据降维至一维,然后用阈值就能分类。这个似乎是一个很好的想法,我们总是希望降维后的数据同一个类别自身内部方差小,不同类别之间的方差要尽可能大。这也是合理的,因为同一个类别的数据应该更加相似,因此方差小;不同类别的数据之间应该很不相似,这样才能更容易对数据进行分类,我们简称为:类内方差小,类间方差大,在计算机语言叫“松耦合,高内聚”。在做具体的推导之前,我们对数据的形式和一些基本统计量做一些描述:
在这里插入图片描述
由于线性判别分析的目标是同一类别内方差小,不同类别之间距离大,因此损失函数定义为:
在这里插入图片描述

(b) 朴素贝叶斯

在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。

(3)决策树

在回归树中,对一个给定的观测值,因变量的预测值取它所属的终端结点内训练集的平均因变量。与之相对应,对于分类树来说,给定一个观测值,因变量的预测值为它所属的终端结点内训练集的最常出现的类。分类树的构造过程与回归树也很类似,与回归树一样,分类树也是采用递归二叉分裂。但是在分类树中,均方误差无法作为确定分裂节点的准则,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
在这里插入图片描述
上式中的p ^ m k代表第m个区域的训练集中第k类所占的比例。但是在大量的事实证明:分类错误率在构建决策树时不够敏感,一般在实际中用如下两个指标代替:
(1) 基尼系数:
在这里插入图片描述
在基尼系数的定义中,我们发现这个指标衡量的是K个类别的总方差。不难发现,如果所有的p ^ m k 的取值都接近0或者1,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标----如果他的取值小,那就意味着某个节点包含的观测值几乎来自同一个类别。
由基尼系数作为指标得到的分类树叫做:CART。
(2) 交叉熵:
可以替代基尼系数的指标是交叉熵,定义如下:
在这里插入图片描述
显然,如果所有的p ^ m k都接近于0或者1,那么交叉熵就会接近0。因此,和基尼系数一样,如果第m个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。

在这里插入图片描述
决策树分类算法的完整步骤:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得基尼系数或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成分类树。

(4)支持向量机SVM

支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。
在这里插入图片描述
支持向量机的基本原理非常简单,如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。

SVM模型的具体形式:
在这里插入图片描述
上面讨论了线性支持向量机是如何工作的,但是在现实生活中,我们很难碰到线性可分的数据集.如果我们使用上面公式的形式将低维数据拓展至高维数据,则必须面临一个很大的问题,那就是:维度爆炸导致的计算量太大的问题。能不能呢个避免这个问题呢?核函数隆重登场,下面介绍几种常用的核函数:
(1) 多项式核函数:
在这里插入图片描述
C用来控制低阶项的强度,C=0,d=1代表无核函数。
(2) 高斯核函数:
高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:
在这里插入图片描述使用高斯核函数之前需要将特征标准化,因此这里衡量的是样本之间的相似度。
(3) Sigmoid核函数:
Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:
在这里插入图片描述
此时的SVM相当于没有隐藏层的简单神经网络。
(4) 余弦相似度核:
常用于衡量两段文字的余弦相似度,表达式为:
在这里插入图片描述

二、示例

1、逻辑回归:

'''
penalty {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’正则化方式
dual     bool类型, default=False   是否使用对偶形式,当n_samples> n_features时,默认dual = False。
C        float类型, default=1.0
solver   {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, default=’lbfgs’
l1_ratio float类型, default=None
'''
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)

在这里插入图片描述

2、线性判别分析:

'''
参数:
solver:{'svd','lsqr','eigen'},默认='svd'
solver的使用,可能的值:
'svd':奇异值分解(默认)。不计算协方差矩阵,因此建议将此求解器用于具有大量特征的数据。
'lsqr':最小二乘解,可以与收缩结合使用。
'eigen':特征值分解,可以与收缩结合使用。
'''
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda_iris = LinearDiscriminantAnalysis()
lda_iris.fit(X,y)
lda_iris.score(X,y)

在这里插入图片描述

3、朴素贝叶斯:

from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)

在这里插入图片描述

4、决策树算法对iris分类:

'''
criterion:{“gini”, “entropy”}, default=”gini”
max_depth:树的最大深度。
min_samples_split:拆分内部节点所需的最少样本数
min_samples_leaf :在叶节点处需要的最小样本数。
'''
from sklearn.tree import DecisionTreeClassifier
tree_iris = DecisionTreeClassifier(min_samples_leaf=5)
tree_iris.fit(X,y)
tree_iris.score(X,y)

在这里插入图片描述

5、支持向量机SVM:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
'''
C:正则化参数。正则化的强度与C成反比。必须严格为正。惩罚是平方的l2惩罚。
kernel:{'linear','poly','rbf','sigmoid','precomputed'},默认='rbf'
degree:多项式和的阶数
gamma:“ rbf”,“ poly”和“ Sigmoid”的内核系数。
shrinking:是否软间隔分类,默认true
'''
svc_iris = make_pipeline(StandardScaler(), SVC(gamma='auto'))
svc_iris.fit(X, y)
svc_iris.score(X,y)

在这里插入图片描述

6、评估模型的性能并调参:

方式1:网格搜索GridSearchCV()

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
import time

start_time = time.time()
pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))
param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]
param_grid = [{'svc__C':param_range,'svc__kernel':['linear']},
              {'svc__C':param_range,'svc__gamma':param_range,'svc__kernel':['rbf']}]
'''
estimator:scikit-learn分类器接口。需要评分机制score()或者scoring参数设置
param_grid:参数名称(字符串)作为键的字典以及用作值的参数设置列表(或这样的字典的列表),可以搜索任何参数设置序列;
    其中:
    (1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0; 
    (2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF"; 
	(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂; 
	(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features; 

scoring:字符串,默认值:无;
cv:交叉验证参数(几折交叉验证)
n_jobs:并行数,与CPU核数一致
'''
gs = GridSearchCV(estimator=pipe_svc,param_grid=param_grid,scoring='accuracy',cv=10,n_jobs=-1)
gs = gs.fit(X,y)
end_time = time.time()

print("网格搜索经历时间:%.3f S" % float(end_time-start_time))
print(gs.best_score_)
print(gs.best_params_)

在这里插入图片描述

方式2:随机网格搜索RandomizedSearchCV()

from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
import time

start_time = time.time()
pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))
param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]
param_grid = [{'svc__C':param_range,'svc__kernel':['linear']},
              {'svc__C':param_range,'svc__gamma':param_range,'svc__kernel':['rbf']}]
# param_grid = [{'svc__C':param_range,'svc__kernel':['linear','rbf'],'svc__gamma':param_range}]

gs = RandomizedSearchCV(estimator=pipe_svc, param_distributions=param_grid,scoring='accuracy',cv=10,n_jobs=-1)
gs = gs.fit(X,y)
end_time = time.time()

print("随机网格搜索经历时间:%.3f S" % float(end_time-start_time))
print(gs.best_score_)
print(gs.best_params_)

在这里插入图片描述

7、当类别为两类时,可以绘制混淆矩阵与ROC曲线:

混淆矩阵:

# 加载数据
df = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data",header=None)
'''
乳腺癌数据集:569个恶性和良性肿瘤细胞的样本,M为恶性,B为良性
'''

import matplotlib
# matplotlib的backend使用的是默认配置agg,此时是无法显示图片的,更改设置为TkAgg
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt

# 做基本的数据预处理
from sklearn.preprocessing import LabelEncoder

X = df.iloc[:,2:].values
y = df.iloc[:,1].values
le = LabelEncoder()    #将M-B等字符串编码成计算机能识别的0-1
y = le.fit_transform(y)
le.transform(['M','B'])

# 数据切分8:2
from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y,random_state=1)
from sklearn.svm import SVC
pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))
from sklearn.metrics import confusion_matrix

pipe_svc.fit(X_train,y_train)
y_pred = pipe_svc.predict(X_test)
# 计算混淆矩阵,以评估分类的准确性。
confmat = confusion_matrix(y_true=y_test,y_pred=y_pred)

'''
subplots参数介绍:
figsize=(2.5,2.5) ,则设置了图像大小。
返回值:
fig:matplotlib.figure.Figure 对象
 ax:子图对象( matplotlib.axes.Axes)或者是他的数组
'''
fig,ax = plt.subplots(figsize=(2.5,2.5))


'''
matshow(A,cmap,alpha)参数介绍:
A为矩阵,此处传入的为刚刚计算出来的混淆矩阵
cmap设定颜色
'''
ax.matshow(confmat, cmap=plt.cm.Blues,alpha=0.3)
for i in range(confmat.shape[0]):
    for j in range(confmat.shape[1]):
        ax.text(x=j,y=i,s=confmat[i,j],va='center',ha='center')
plt.xlabel('predicted label')
plt.ylabel('true label')
plt.show()

在这里插入图片描述
绘制ROC曲线:

from sklearn.metrics import roc_curve,auc
from sklearn.metrics import make_scorer,f1_score

# 此处用f1来计分
scorer = make_scorer(f1_score,pos_label=0)
# 进行网格搜索
gs = GridSearchCV(estimator=pipe_svc,param_grid=param_grid,scoring=scorer,cv=10)

'''
decision_function
表示通过度量样本距离分隔超平面距离的来表示置信度
计算分类器在测试集上的决策值
用法可以参考文章: https://blog.csdn.net/cxx654/article/details/106727812
'''
y_pred = gs.fit(X_train,y_train).decision_function(X_test)
#y_pred = gs.predict(X_test)

# 计算真阳率和假阳率
fpr,tpr,threshold = roc_curve(y_test, y_pred)
# 计算auc的值
roc_auc = auc(fpr,tpr)

lw = 2
plt.figure(figsize=(7,5))
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假阳率为横坐标,真阳率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([-0.05, 1.0])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic ')
plt.legend(loc="lower right")
plt.show()

在这里插入图片描述

三、作业

(1)回归问题和分类问题的联系和区别,如何利用回归问题理解分类问题

区别:

  • 分类是预测一个离散标签的任务,分类预测可以使用准确率来评价,而回归问题则不能
  • 回归是预测一个连续数量的任务,回归预测可以使用均方根误差来评价,但是分类问题则不能。

联系:

  • 分类算法可能预测到一个连续的值,但是这些连续值对应的是一个类别的概率的形式。
  • 回归算法可以预测离散值,但是以整型量的形式预测离散值的。

利用回归问题理解分类问题

在一些情况中是可以将回归问题转换成分类问题的。例如,被预测的数量是可以被转换成离散数值的范围的。在$0 到$100 之间的金额可以被分为两个区间:
class 0:$0 到$49
class 1: $50 到$100
这通常被称作离散化,结果中的输出变量是一个分类,分类的标签是有顺序的(称为叙序数)。

我们通过将连续的数值转化为一个范围区间,即离散数值区间,将回归问题转换为分类问题。

参考:https://www.jiqizhixin.com/articles/2017-12-15-2

(2)为什么分类问题的损失函数可以是交叉熵而不是均方误差

交叉熵Loss和均方差Loss定义如下:
在这里插入图片描述
用梯度下降法对两者损失函数中的w求导:
在这里插入图片描述
可知的导数sigmoid 在输出接近 0 和 1 的时候是非常小的,故导致在使用最小均方差Loss时,模型参数w会学习的非常慢。而使用交叉熵Loss则没有这个问题。为了更快的学习速度,分类问题一般采用交叉熵损失函数。

参考:https://zhuanlan.zhihu.com/p/104130889

(3)线性判别分析和逻辑回归在估计参数方面有什么异同点

  • 不同:LDA需要假设服从正态分布,根据样本计算均值和协方差矩阵,然后带入判别式。而LogitsR使用极大对数似然估计参数。
  • 相同:都是输入每个类的变量

(4)尝试从0推导SVM

在支持向量机中, 我们用间隔 (margin) 刻画划分超平面与样本之间的距离.。在引入间隔之前, 我们需要先知道如何计算空间中点到平面的距离。R d空间中某点 p ∈ R 到超平面 w ⊤ x + b = 0的距离为:
在这里插入图片描述
间隔表示距离划分超平面最近的样本到划分超平面距离的两倍,即

在这里插入图片描述
线性支持向量机的目标是找到一组合适的参数(w; b), 使得
在这里插入图片描述
但是这个问题十分复杂, 难以处理. 为了能在现实中应用, 我们希望能对其做一些简化。由于对 (w; b) 的放缩不影响解, 为了简化优化问题,我们约束 (w; b) 使得:
在这里插入图片描述
因此,我们线性支持向量机的问题可重述为:找到一组合适的参数(w; b), 使得
在这里插入图片描述
写成拉格朗日函数的形式为:
在这里插入图片描述
线性支持向量机的对偶问题等价于找到一组合适的参数 α, 使得那么其对偶问题为:
在这里插入图片描述
通过求导的方式可得:
在这里插入图片描述
将求导后的结果代入对偶问题中可得最后代求的优化问题:
在这里插入图片描述

(5)二次判别分析,线性判别分析,朴素贝叶斯之间的联系和区别

  • 线性判别分析(LDA)构造了线性决策平面和二次判别分析(QDA)构造了二次决策平面,这些分类器很容易计算得到解析解(指通过严格的公式所求得的解),其天生具有多分类的特性,且在实践中无需调参。线性判别分析与二次判别分析不同之处在于二次判别分析可以学习二次边界,模型更加灵活。

  • 朴素贝叶斯是个生成模型,朴素贝叶斯分类器以贝叶斯定理为基础,假设所有特征之间相互独立的概率分类器,LDA和QDA则不做要求。

(6)使用python+numpy实现逻辑回归

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 21/8/22 12:34 by 洲建国同志

from math import exp
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets.samples_generator import make_blobs


def sigmoid(num):
    '''

    :param num: 待计算的x
    :return: sigmoid之后的数值
    '''
    if type(num) == int or type(num) == float:
        return 1.0 / (1 + exp(-1 * num))
#   else:
#       raise ValueError, 'only int or float data can compute sigmoid'


class logistic():
    def __init__(self, x, y):
        if type(x) == type(y) == list:
            self.x = np.array(x)
            self.y = np.array(y)
        elif type(x) == type(y) == np.ndarray:
            self.x = x
            self.y = y
#         else:
#             raise ValueError, 'input data error'

    def sigmoid(self,x):
        '''
        :param x: 输入向量
        :return: 对输入向量整体进行simgoid计算后的向量结果
        '''
        s = np.frompyfunc(lambda x: sigmoid(x), 1, 1)
        #第二个参数为func中的参数个数,第三个参数为func中的返回值的个数
        return s(x)

    def train_with_punish(self, alpha, errors, punish=0.0001):
        '''
        :param alpha: alpha为学习速率
        :param errors: 误差小于多少时停止迭代的阈值
        :param punish: 惩罚系数
        :param times: 最大迭代次数
        :return:
        '''
        self.punish = punish
        dimension = self.x.shape[1]
        self.theta = np.random.random(dimension)
        compute_error = 100000000
        times = 0
        while compute_error > errors:
            res = np.dot(self.x, self.theta)
            delta = self.sigmoid(res) - self.y
            self.theta = self.theta - alpha * np.dot(self.x.T, delta) - punish * self.theta  # 带惩罚的梯度下降方法
            compute_error = np.sum(delta)
            times += 1

    def predict(self, x):
        '''
        :param x: 给入新的未标注的向量
        :return: 按照计算出的参数返回判定的类别
        '''
        x = np.array(x)
        if self.sigmoid(np.dot(x, self.theta)) > 0.5:
            return 1
        else:
            return 0


def test1():
    '''
    用来进行测试和画图,展现效果
    :return:
    '''
    x, y = make_blobs(n_samples=200, centers=2, n_features=2, random_state=0, center_box=(10, 20))
    x1 = []
    y1 = []
    x2 = []
    y2 = []
    for i in range(len(y)):
        if y[i] == 0:
            x1.append(x[i][0])
            y1.append(x[i][1])
        elif y[i] == 1:
            x2.append(x[i][0])
            y2.append(x[i][1])
    # 以上均为处理数据,生成出两类数据
    p = logistic(x, y)
    p.train_with_punish(alpha=0.00001, errors=0.005, punish=0.01)  # 步长是0.00001,最大允许误差是0.005,惩罚系数是0.01
    x_test = np.arange(10, 20, 0.01)
    y_test = (-1 * p.theta[0] / p.theta[1]) * x_test
    plt.plot(x_test, y_test, c='g', label='logistic_line')
    plt.scatter(x1, y1, c='r', label='positive')
    plt.scatter(x2, y2, c='b', label='negative')
    plt.legend(loc=2)
    plt.title('punish value = ' + p.punish.__str__())
    plt.show()


if __name__ == '__main__':
    test1()

在这里插入图片描述

(7)了解梯度下降法,牛顿法,拟牛顿法与SOM算法等优化算法

  • 梯度下降法:其本质是仅仅使用函数的一阶导数信息选取下降方向 d k,这其中最基本的算法是梯度下降法,即直接选择负梯度作为下降方向 d k.
  • 牛顿法:牛顿类算法就是利用二阶导数信息来构造迭代格式的算法.由于利用的信息变多,牛顿法的实际表现可以远好于梯度法,但是它对函数 f (x) 的要求也相应变高.
  • 拟牛顿法:它能够在每一步以较小的计算代价生成近似矩阵,并且使用近似矩阵代替海瑟矩阵而产生的迭代序列仍具有超线性收敛的性质。
  • smo算法:序列最小化 (SMO) 是一个利用支持向量机自身特性高效的优化算法. SMO 的基本思路是坐标下降。

总结

以上就是今天要讲的内容,本文使用sklearn构建完整的分类项目,回顾了机器学习中的一些分类模型,也实践了相关模型的调用代码,复现了一些案例,做了本人的理解与注释,在这里再次感谢datawhale开源社区的小伙伴们的学习帮助,如更多的学习资料请联系datawhale参加组队学习获取。

相关资料:
【1】教学视频:https://www.bilibili.com/video/BV1Mb4y1o7ck?from=search&seid=6085778383215596866
【2】教案:https://github.com/datawhalechina/ensemble-learning
【3】datawhale开源学习社区:http://datawhale.club/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值