Python机器学习笔记02--Scikit-learn库

Python机器学习笔记01--机器学习基础 

本文索引:

  1. Sklearn库概述
  2. Sklearn库分类算法
  3. Sklearn库回归算法

本篇内容比较不好理解,还有一些jupyter notebook操作 ,这里放出我的jupyter notebook笔记文件:

一、Sklearn库概述

  • Scikit-learn项目最早由数据科学家David Cournapeau在2007年发起,使用需要Numpy和SciPy等其他库的支持,是Python中专门针对机器学习应用而发展起来的一款开源扩展库。
  • 和其他众多的开源项目一样,Scikit-learn目前主要由社区成员自发进行维护。
  • Scikit-learn相比开源项目显得更为保守,主要体现在:一是Scikit-learn从来不做除机器学习领域之外的其他扩展,二是Scikit-learn从来不采用未经广泛验证的算法。
  • http://scikit-learn.org/stable/index.html

【Scikit-learn库数据集】

  • 在机器学习中,经常使用各种各样的数据集,Scikit-learn库提供了一些常用的数据集:
序号 数据集名称 调用方式 数据描述
1 鸢尾花数据集 Load_iris() 用于多分类任务的数据集
2 波士顿房价数据集 Load_boston() 用于回归任务的经典数据集
3 糖尿病数据集 Load_diabetes() 用于回归任务的经典数据集
4 手写数字数据集 Load_digits() 用于多分类任务的数据集
5 乳腺癌数据集 Load_breast_cancer() 经典的用于二分类任务的数据集
6 体能训练数据集 Load_linnerud() 经典的用于多变量回归任务的数据集

【Scikit-learn库功能】

1.分类

  • 分类是指识别给定对象的所属类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别等。
  • 目前Scikit-learn已经实现的算法包括:支持向量机(SVM),最近邻,逻辑回归,随机森林,决策树以及多层感知器(MLP)神经网络等。

2.回归

  • 回归是指预测与给定对象相关联的连续值属性,最常见的应用场景包括预测药物反应和预测股票价格等。
  • 目前Scikit-learn已经实现的算法包括:支持向量回归(SVR),脊回归,Lasso回归,弹性网络(Elastic Net),最小角回归(LARS),贝叶斯回归,以及各种不同的鲁棒回归算法等。
  • 回归算法几乎涵盖了所有开发者的需求范围,而且更重要的是,Scikit-learn还针对每种算法提供了简单明了的用例参考。

3.聚类

  • 聚类是指自动识别具有相似属性的给定对象,并将其分组为集合,属于无监督学习的范畴。
  • 最常见的应用场景包括顾客细分和试验结果分组。目前Scikit-learn已经实现的算法包括:K-均值聚类,谱聚类,均值偏移,分层聚类,DBSCAN聚类等。

4.数据降维

  • 数据降维是指使用主成分分析(PCA)、非负矩阵分解(NMF)或特征选择等降维技术来减少要考虑的随机变量的个数,其主要应用场景包括可视化处理和效率提升。

5.模型选择

  • 模型选择是指对于给定参数和模型的比较、验证和选择,其主要目的是通过参数来提升精度。目前Scikit-learn实现的模块包括:格点搜索,交叉验证和各种针对预测误差评估的度量函数。

6.数据预处理

  • 数据预处理是指数据的特征提取和归一化,是机器学习过程中的第一个也是最重要的一个环节。
  • 归一化是指将输入数据转换为具有零均值和单位权方差的新变量,但因为大多数时候都做不到精确等于零,因此会设置一个可接受的范围,一般都要求落在0-1之间。
  • 特征提取是指将文本或图像数据转换为可用于机器学习的数字变量。

二、Sklearn库分类算法

【K近邻分类器(KNN)】

  • KNN:通过计算待分类数据点,与已有数据集中的所有数据点的距离。取距离最小的前K个点,根据“少数服从多数”的原则,将这个数据点划分为出现次数最多的那个类别。

如上图,我们要将带?号的数据分类,当K=1时,圈内只有一个正方形,所以将其归类为Class1,当K=3时,圈内有一个正方形和两个红色三角形,根据少数服从多数原则,将其归类为Class2.

【Sklearn中的k邻分类器】

  • 在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier创建一个K近邻分类器,主要参数有:
  • n_learnbors:用于指定分类器K的大小(默认值为5)。
  • Weights:设置选中的K个点对分类结果影响的权重(默认值为平均权重“uniform”,可以选择“distance”代表越近的点权重越高,或者传入自己编写的以距离为参数的权重计算函数)。
  • algorithm:设置用于计算临近点的方法(选项中有ball_tree、kd_tree和brute,分别代表不同的寻找邻居的优化算法,默认值为auto,根据训练数据自动选择)。

示例:给定一组数据X=[[0],[1],[2],[3],[4],[5]],对应的标签为y=[0,0,0,1,1,1],现使用Scikit-learn库的K近邻分类器对未知数据[0.5,1.6,2.5,2.6,3.8,10]进行分类,输入其对应的标签 

from sklearn.neighbors import KNeighborsClassifier
# 准备数据和对应的标签
x = [[0],[1],[2],[3],[4],[5]]
y = [0,0,0,1,1,1]

# 生成分类器
neigh = KNeighborsClassifier(n_neighbors = 1)
# 将数据送入训练
neigh.fit(x,y)
# 预测分类
print(neigh.predict([[0.5]]))
print(neigh.predict([[1.6]]))
print(neigh.predict([[2.5]]))
print(neigh.predict([[2.6]]))
print(neigh.predict([[3.8]]))
print(neigh.predict([[10]]))

输出结果:


[0]
[0]
[0]
[1]
[1]
[1]

【决策树】

  • 决策树是一种树形结构的分类器,通过顺序访问分类点的属性决定最终的类别。
  • 通常根据特征的信息增益或其他指标,构建一颗决策树。
  • 在分类时,只需要按照决策树中的结点一次进行判断,即可得到样本所属类别。

看下面这个相亲的决策树:很容易理解

【Sklearn中的决策树】

  • 在sklearn库中,可以使用sklearn.tree.DecisionTreeClassifier创建一个决策树用于分类,主要参数有:
  • criterion:用于选择属性的准则,可以传入“gini”代表基尼系数,或者“entropy”代表信息增益。
  • max_features:表示决策树结点进行分裂时,从多少个特征中选择最优特征。可以设定固定数目、百分比或其他标准,默认值是所有特征个数。
  • 鸢尾花分类实战
  • 数据集简介
  • 鸢尾花数据集是机器学习领域一个非常经典的分类数据集。接下来,我们就用这个训练为基础,一步一步地训练一个机器学习模型。首先,我们来看下该数据集的基本构成。数据集的准确名称为Iris Data Set,总共包含150行数据。每一行数据由四个特征值及一个目标值组成。其中4个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。而且标值及为三种不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。

 

Sepal length Sepal width Petal width Petal width  Species
5.0 2.0 3.5 1.0 I.versicolor
6.0 2.2 5.0 1.5 I.virginica
6.0 2.2 4.0 1.0 I.versicolor
6.2 2.2 4.5 1.5 I.versicolor
4.5 2.3 1.3 0.3 I.setosa
from sklearn import datasets

iris = datasets.load_iris()
iris_feature = iris.data
iris_target = iris.target

iris_target

运行结果:

array([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, 0, 0, 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, 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, 1, 1, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

这里,scikit-learn已经将花的原名进行了替换,其中0,1,2分别代表Iris Setosa,Iris Versicolour和Iris Virginica。

这些数据是按照鸢尾花类别的顺序排列的。所以,如果我们将其直接划分为训练集合数据集的话,就会造成数据的分布不均匀。详细来讲,直接划分容易造成某种类型的花在训练数据集中一次都未出现,训练的模型就永远不可能预测出这种花来。你可能会想到,我么将这些数据打乱后再划分训练集和数据集。当然,更方便地,scikit-learn为我们提供了训练数据集和数据集的方法。

from sklearn.model_selection import train_test_split
# 特征训练集测试集,
feature_train,feature_test,target_train,target_test = train_test_split(iris_feature,iris_target,test_size = 0.3,random_state = 42)

target_train

运行结果:

array([1, 2, 2, 1, 2, 1, 2, 1, 0, 2, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 1,
       2, 0, 1, 2, 0, 2, 2, 1, 1, 2, 1, 0, 1, 2, 0, 0, 1, 1, 0, 2, 0, 0,
       1, 1, 2, 1, 2, 2, 1, 0, 0, 2, 2, 0, 0, 0, 1, 2, 0, 2, 2, 0, 1, 1,
       2, 1, 2, 0, 2, 1, 2, 1, 1, 1, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0,
       2, 0, 1, 2, 2, 1, 2, 1, 1, 2, 2, 0, 1, 2, 0, 1, 2])

其中, feature_train,feature_test,target_train,target_test分别代表训练集特征、测试集特征、训练集目标值、测试集目标值。test_size参数代表划分到测试集数据占全部数据的百分比,你也可以用train_size来指定训练集所占全部数据的百分比。一般情况下,我们会将整个训练集划分为70%训练集和30%测试集。最后的random_state参数表示乱序程度。

现在,花的种类已经变成了乱序状态,并且只包含有整个训练集的70%数据。

下面我们来看简单的模型训练和预测:

  • 首先,导入决策树分类器,然后使用fit方法和predict方法对模型进行训练和预测
from sklearn.tree import DecisionTreeClassifier

dt_model = DecisionTreeClassifier()
dt_model.fit(feature_train,target_train)

predict_results = dt_model.predict(feature_test)
  • 分别输出预测结果和测试集的真实值进行比较
print(predict_results)
print(target_test)

可以的得到以下的输出结果:


[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
 0 0 0 2 1 1 0 0]
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
 0 0 0 2 1 1 0 0]

我们发现两个结果是一样的,说明训练的结果比较好。 

  • 另外可以通过scikit-learn中提供的评估计算方法直接查看预测结果的准确度
from sklearn.metrics import accuracy_score

print(accuracy_score(predict_results,target_test))

得到的结果为:

1.0

即我们预测的结果准确度为1.0,是完全一致的。


三、Sklearn库回归算法

【Sklearn中的库回归算法】

  • 线性回归函数包括:普通线性回归函数(LinearRegression),岭回归(Ridge),Lasso回归(Lasso)。
  • 非线性回归函数,如多项式回归(Polynomial Features)通过sklearn.preprocessing子模块进行调用。

【Sklearn中的线性回归:房价与房屋尺寸线性拟合】

  • 技术路线:sklearn.linear_model.LinearRegression
  • 调用sklearn.linear_model.LinearRegression()所需函数:
  • fit_intercept:布尔参数,表示是否计算该模型截距。可选参数;
  • normalize:布尔参数,若为True,则X在回归前进行归一化。可选参数。默认值为False;
  • copy_X:布尔型参数,若为True,则X将被复制;否则将被覆盖。可选参数。默认值为True;
  • n_jobs:整形参数,表示用于计算的作业数量;若为-1,则用所有的CPU。可选参数。默认值为1;

Scikit-learn回归算法:

看实战线性回归拟合房屋面积与房屋价格

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model

datasets_X = []  # 房屋面积
datasets_Y = []  # 房屋价格
fr = open('prices.txt','r')   # 打开价格文件,只读
lines = fr.readlines()
for line in lines:
    items = line.strip().split(',')
    datasets_X.append(int(items[0]))   # 注意加上类型装换
    datasets_Y.append(int(items[1]))
    
# 将datasets_X转换为二维数组,以符合linear.fit函数的参数要求
datasets_X = np.array(datasets_X).reshape([-1,1])
datasets_Y = np.array(datasets_Y)

# 以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])

linear = linear_model.LinearRegression()
linear.fit(datasets_X,datasets_Y)    # 导入训练

# 图像中显示

plt.scatter(datasets_X,datasets_Y,color = 'red',label = 'origin data')
plt.plot(X,linear.predict(X),color = 'blue',label = 'linear regression prediction')
plt.legend()   
plt.xlabel('Area')
plt.xlabel('Price')
plt.show()

运行结果: 

这里我把prices.txt文件内容放在下面,大家直接复制到一个新建的文本中并该名称为prices即可(给大家省点下载积分),但是注意上面的路径,如果ipynb文件和prices.txt在同一路径下可以不用指定,如果不在,请加上txt文件的绝对路径值,避免运行出错。

2104,399900
1600,329900
2400,369000
1416,232000
3000,539900
1985,299900
1534,314900
1427,198999
1380,212000
1494,242500
1940,239999
2000,347000
1890,329999
4478,699900
1268,259900
2300,449900
1320,299900
1236,199900
2609,499998
3031,599000
1767,252900
1888,255000
1604,242900
1962,259900
3890,573900
1100,249900
1458,464500
2526,469000
2200,475000
2637,299900
1839,349900
1000,169900
2040,314900
3137,579900
1811,285900
1437,249900
1239,229900
2132,345000
4215,549000
2162,287000
1664,368500
2238,329900
2567,314000
1200,299000
852,179900
1852,299900
1203,239500

 加油哦。。

猜你喜欢

转载自blog.csdn.net/MARS_098/article/details/104080399
今日推荐