小白机器学习速通教程--算法入门


往期文章: 小白机器学习速通实用教程1

一.从sklearn获取实验数据

  • 调用:from sklearn.datasets import name(name为代指,详细见下方)
  • 作用:获取sklearn提供的流行数据集,用于实验(分类型数据与回归型的都有)
  • name: Sklearn.datasets.name有两种,一个为load_*,一个为fetch_*
    一:datasets.load_*()
    *指的是不同的名称,
    获取小规模数据集,数据包已经含在datasets里,在本地有
    例如:from sklearn.datasets import load_iris,导入鸢尾花数据集
    二:datasets.fetch_* (data_home=None)
    获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是、/scikit-learndata/
    例如:from sklearn.datasets import fetch_20newsgroups
  • 返回类型:
    -load*和fetch*返回的数据类型都是datasets.base.Bunch(字典格式)
    有下列方法:
    • .data:特征数据数组(特征值),是[n_samples*n_features]的二维numpy.ndarray数组(n_samples指多少个样本,n_fearures指多少个特征)
    • .target:标签数组(目标值),是n-samples的一维numpy.ndarray数组,一个样本对应一个标签
    • .DESCR:数据描述(简介)
    • .featue_names:特征的名称,(新闻数据,手写数字、回归数据集没有feature-names)
    • .target_names:标签名列表(列如鸢尾花数据,标签列表为setosa’ ‘versicolor’ 'virginica.)
  • 代码实现:
from sklearn.datasets import load_iris,fetch_20newsgroups
 li = load_iris ()
   print ( li.data )
   print ( li.feature_names )
   print(li.target_names)

输出:在这里插入图片描述

二.数据集的划分

用来训练模型的数据与用来评估的数据不能是同一个数据,否则是用自己证明自己,所以需要把数据划分为两类,一类为训练集(用于构建模型),一类为测试集(用于估计模型)
经过实验,比较好的数据比例是 训练集:测试集为75:25

  • 调用:from sklearn.model_selection import train_test_split
  • 作用:对数据集进行自动划分,分为测试集与训练集
  • 参数: sklearn.model_selection.traintestsplit(x,y)
    ×:数据集的特征值(li.data就是)
    Y:数据集的目标值(li.target就是)
    test_size:测试集的大小,一般为float,test_size=0.25就是75:25
    random_state:随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
    • 返回值:依次为,训练集特征值,测试集特征值,训练标签,测试标签(四个值顺序一定)
  • 代码实现:
x_train , x_test , y_train , y_test = train_test_split ( li.data , li.target , test_size=0.25 )#x_train为训练集特征值,y_train为训练集目标值。x_test为测试集特征值,y_test为测试集目标值

三.转换器与估计器

  • 转换器:transform(是用在数据预处理中,在上篇文章中的函数都有该方法,小白机器学习实用笔记1
    fit_transform():输入数据直接转换
    fit():输入数据,但不做事情,进行计算平均值、方差等等,就是求出了公式里的标准
    列如:标准化里面的平均值和方差,归一化里面的最大值和最小值。
    transform():再把数据输入到transform中,进行数据的转换
    重点:
    转化完一组数据后,当需要添加新的数据,进行转换的时候,用transform而不是fit_transform因为fit_transform是先计算标准,再改变数据,会导致前后数据的标准不同。直接用transform就是用之前数据的标准添加新的数据,能够保证数据的参数统一(因为没有用fit())
  • 估计器:是实现了算法的api在这里插入图片描述
    3其他:聚类的估计器

四.分类算法之k临近算法

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最临近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

假单理解:根据测试的特征值,跟哪个值最近,就判断他的目标值是哪个

  • 1.如何求距离
    在这里插入图片描述

  • 2.使用要求:需要提前对数据做标准化,训练值和测试值的特征值都要标准化,但目标值不需要标准化

  • 3.调用:from sklearn.neighbors import KNeighborsClassifier
    在这里插入图片描述
    k值(n_neighbors),就是判断与多少个值近似从而得出目标值。取值会影响结果的判断;

    • 方法:这里我们把训练集的特征值叫x_train,目标值叫y_train;测试集的特征值叫x_test,目标值叫y_test

      • .fit()传入x_train,y_train,作用确定训练集,没有做数据处理
      • .predict()传入x_test,传入测试集的特征值,用来计算,作用是得到预测的结果,就是每一个测试值算出来的目标值,用一个参数接受(这里我们定义为y_predict)
      • .score()得出预测的准确率,传入x_test,y_test,
  • 4.代码实现:

    li = load_iris ()
    x_train , x_test , y_train , y_test = train_test_split ( li.data , li.target , test_size=0.25 )
    stand = StandardScaler ()
    x_test = stand.fit_transform ( x_test )
    x_train = stand.transform ( x_train )
    knn = KNeighborsClassifier (n_neighbors = 3)
    knn.fit ( x_train , y_train )
    y_predict = knn.predict ( x_test )
    print ( '预测值为:' , y_predict )
    print ( '实际值为:' , y_test )
    print ( '准确率:' , knn.score ( x_test , y_test ) )

输出:在这里插入图片描述

  • 5.总结
    1.需要调参,参数没选好,结果就会被影响(n_neighbors)
    k值取很小:容易受异常点影响
    k值取很大:容易受k值数量(类别)波动,假如一共就五个,k值如果等于3,那么影响很大
    性能很差:时间复杂度很高,所以用的很少

    2.优点:简单,易于理解,无需估计参数,无需训练(后续文章会解释,只需要知道即可,估计参数与调参不一样)

    3.缺点:懒惰算法,内存占用大
    严重依赖k值,对精度影响过大

4.使用场景:小数据场合,几千到几万的样本

五.朴素贝叶斯算法

含有概率论的思想,这里介绍一下有关内容

  • 联合概率与条件概率在这里插入图片描述

  • 原理:这个要理解和记住,很重要,此公式应用在多个前提的情况下,(因为在上面我们看到条件概率是只有一个前提B,然后求事件A1和A2同时发生的概率)
    在这里插入图片描述
    因为素贝叶斯通常用在文档分类,把文档看成是多个词组成,就是多个条件

  • 拉普拉斯平滑:
    使用原因(了解就行):朴素贝叶斯公式分子中的前提条件中,只要有一个概率为0,结果就是0,但实际上一个条件不因应当完全影响结果,所以引入。
    在这里插入图片描述

  • 应用前提:特征之间相互独立,通常用来对文章进行分类

  • 调用:from sklearn.naive_bayes import MultinomialNB

    • 参数:alpha=?这就是拉普拉斯平滑系数,写1.0即可

    • 方法:跟k临近算法一样

      .fit()传入x_train,y_train,作用确定训练集,没有做数据处理
      
      .predict()传入x_test,传入测试集的特征值,用来计算,作用是得到预测的结果,就是每一个测试值算出来的目标值,用一个参数接受(这里我们定义为y_predict)
      
      .score()得出预测的准确率,传入x_test,y_test,
      
  • 代码实现:几乎与k临近算法相似,只是换了StandardScarler为MultinomialNB

    nws = fetch_20newsgroups ( subset = 'all' )
    # 数据分割:
    x_train , x_test , y_train , y_test = train_test_split ( nws.data , nws.target , test_size = 0.25 )
    # 进行特征抽取
    tf = TfidfVectorizer ( )
    x_train = tf.fit_transform ( x_train )
    # 测试集统计的就是训练集的标准,所以用transform,保证标准统一,就是特征词的列表由训练集产生
    x_test = tf.transform ( x_test )
    #输出特征列表,有哪些特征,由于是文章,所以特别多
    print ( tf.get_feature_names ( ) )
    mlt = MultinomialNB(alpha = 1.0)
    print ( x_train.toarray ( ) )
    mlt.fit ( x_train , y_train )
    y_predict = mlt.predict ( x_test )
    print('文章类别:',y_train)
    print ( '预测的文章类别:' , y_predict )
    print ( '准确率:' , mlt.score ( x_test , y_test ) )
    

    输出:在这里插入图片描述

往期文章:小白机器学习速通实用教程1

猜你喜欢

转载自blog.csdn.net/MICHLEislover/article/details/113059237