目录

机器学习组成:模型、策略、优化

开发机器学习应用程序的步骤

scikit-learn数据集

sklearn.datasets

获取小数据集

获取大数据集

获取本地生成数据

模型的选择

如何选择合适的算法模型

监督学习中三类问题的解释


机器学习组成:模型、策略、优化

《统计机器学习》中指出:机器学习=模型+策略+算法。其实机器学习可以表示为:Learning= Representation+Evalution+Optimization。我们就可以将这样的表示和李航老师的说法对应起来。机器学习主要是由三部分组成,即:表示(模型)、评价(策略)和优化(算法)。

表示(或者称为:模型):Representation

表示主要做的就是建模,故可以称为模型。模型要完成的主要工作是转换:将实际问题转化成为计算机可以理解的问题,就是我们平时说的建模。类似于传统的计算机学科中的算法,数据结构,如何将实际的问题转换成计算机可以表示的方式。这部分可以见“简单易学的机器学习算法”。给定数据,我们怎么去选择对应的问题去解决,选择正确的已有的模型是重要的一步。

评价(或者称为:策略):Evalution

评价的目标是判断已建好的模型的优劣。对于第一步中建好的模型,评价是一个指标,用于表示模型的优劣。这里就会是一些评价的指标以及一些评价函数的设计。在机器学习中会有针对性的评价指标。

  • 分类问题

优化:Optimization

优化的目标是评价的函数,我们是希望能够找到最好的模型,也就是说评价最高的模型。

开发机器学习应用程序的步骤

(1)收集数据

我们可以使用很多方法收集样本护具,如:制作网络爬虫从网站上抽取数据、从RSS反馈或者API中得到信息、设备发送过来的实测数据。

(2)准备输入数据

得到数据之后,还必须确保数据格式符合要求。

(3)分析输入数据

这一步的主要作用是确保数据集中没有垃圾数据。如果是使用信任的数据来源,那么可以直接跳过这个步骤

(4)训练算法

机器学习算法从这一步才真正开始学习。如果使用无监督学习算法,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容在第(5)步

(5)测试算法

这一步将实际使用第(4)步机器学习得到的知识信息。当然在这也需要评估结果的准确率,然后根据需要重新训练你的算法

(6)使用算法

转化为应用程序,执行实际任务。以检验上述步骤是否可以在实际环境中正常工作。如果碰到新的数据问题,同样需要重复执行上述的步骤

scikit-learn数据集

我们将介绍sklearn中的数据集类,模块包括用于加载数据集的实用程序,包括加载和获取流行参考数据集的方法。它还具有一些人工数据生成器。

sklearn.datasets

(1)datasets.load_*()

获取小规模数据集,数据包含在datasets里

(2)datasets.fetch_*()

获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/,要修改默认目录,可以修改环境变量SCIKIT_LEARN_DATA

(3)datasets.make_*()

本地生成数据集

load*和 fetch* 函数返回的数据类型是 datasets.base.Bunch,本质上是一个 dict,它的键值对可用通过对象的属性方式访问。主要包含以下属性:

  • data:特征数据数组,是 n_samples * n_features 的二维 numpy.ndarray 数组

  • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组

  • DESCR:数据描述

  • feature_names:特征名

  • target_names:标签名

数据集目录可以通过datasets.get_data_home()获取,clear_data_home(data_home=None)删除所有下载数据

  • datasets.get_data_home(data_home=None)

返回scikit学习数据目录的路径。这个文件夹被一些大的数据集装载器使用,以避免下载数据。默认情况下,数据目录设置为用户主文件夹中名为“scikit_learn_data”的文件夹。或者,可以通过“SCIKIT_LEARN_DATA”环境变量或通过给出显式的文件夹路径以编程方式设置它。'〜'符号扩展到用户主文件夹。如果文件夹不存在,则会自动创建。

  • sklearn.datasets.clear_data_home(data_home=None)

删除存储目录中的数据

获取小数据集

用于分类

  • sklearn.datasets.load_iris
class sklearn.datasets.load_iris(return_X_y=False)"""加载并返回虹膜数据集:param return_X_y: 如果为True,则返回而不是Bunch对象,默认为False:return: Bunch对象,如果return_X_y为True,那么返回tuple,(data,target)"""
In [12]: from sklearn.datasets import load_iris...: data = load_iris()...:In [13]: data.target
Out[13]:
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])In [14]: data.feature_names
Out[14]:
['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']In [15]: data.target_names
Out[15]:
array(['setosa', 'versicolor', 'virginica'],dtype='|S10')In [17]: data.target[[1,10, 100]]
Out[17]: array([0, 0, 2])
名称 数量
类别 3
特征 4
样本数量 150
每个类别数量 50
  • sklearn.datasets.load_digits
class sklearn.datasets.load_digits(n_class=10, return_X_y=False)"""加载并返回数字数据集:param n_class: 整数,介于0和10之间,可选(默认= 10,要返回的类的数量:param return_X_y: 如果为True,则返回而不是Bunch对象,默认为False:return: Bunch对象,如果return_X_y为True,那么返回tuple,(data,target)"""
In [20]: from sklearn.datasets import load_digitsIn [21]: digits = load_digits()In [22]: print(digits.data.shape)
(1797, 64)In [23]: digits.target
Out[23]: array([0, 1, 2, ..., 8, 9, 8])In [24]: digits.target_names
Out[24]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [25]: digits.images
Out[25]:
array([[[  0.,   0.,   5., ...,   1.,   0.,   0.],[  0.,   0.,  13., ...,  15.,   5.,   0.],[  0.,   3.,  15., ...,  11.,   8.,   0.],...,[  0.,   4.,  11., ...,  12.,   7.,   0.],[  0.,   2.,  14., ...,  12.,   0.,   0.],[  0.,   0.,   6., ...,   0.,   0.,   0.]],[[  0.,   0.,  10., ...,   1.,   0.,   0.],[  0.,   2.,  16., ...,   1.,   0.,   0.],[  0.,   0.,  15., ...,  15.,   0.,   0.],...,[  0.,   4.,  16., ...,  16.,   6.,   0.],[  0.,   8.,  16., ...,  16.,   8.,   0.],[  0.,   1.,   8., ...,  12.,   1.,   0.]]])
名称 数量
类别 10
特征 64
样本数量 1797

用于回归

  • sklearn.datasets.load_boston
class  sklearn.datasets.load_boston(return_X_y=False)"""加载并返回波士顿房价数据集:param return_X_y: 如果为True,则返回而不是Bunch对象,默认为False:return: Bunch对象,如果return_X_y为True,那么返回tuple,(data,target)"""
In [34]: from sklearn.datasets import load_bostonIn [35]: boston = load_boston()In [36]: boston.data.shape
Out[36]: (506, 13)In [37]: boston.feature_names
Out[37]:
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'],dtype='|S7')In [38]:
名称 数量
目标类别 5-50
特征 13
样本数量 506
  • sklearn.datasets.load_diabetes
class sklearn.datasets.load_diabetes(return_X_y=False)"""加载和返回糖尿病数据集:param return_X_y: 如果为True,则返回而不是Bunch对象,默认为False:return: Bunch对象,如果return_X_y为True,那么返回tuple,(data,target)"""
In [13]:  from sklearn.datasets import load_diabetesIn [14]: diabetes = load_diabetes()In [15]: diabetes.data
Out[15]:
array([[ 0.03807591,  0.05068012,  0.06169621, ..., -0.00259226,0.01990842, -0.01764613],[-0.00188202, -0.04464164, -0.05147406, ..., -0.03949338,-0.06832974, -0.09220405],[ 0.08529891,  0.05068012,  0.04445121, ..., -0.00259226,0.00286377, -0.02593034],...,[ 0.04170844,  0.05068012, -0.01590626, ..., -0.01107952,-0.04687948,  0.01549073],[-0.04547248, -0.04464164,  0.03906215, ...,  0.02655962,0.04452837, -0.02593034],[-0.04547248, -0.04464164, -0.0730303 , ..., -0.03949338,-0.00421986,  0.00306441]])
名称 数量
目标范围 25-346
特征 10
样本数量 442

获取大数据集

  • sklearn.datasets.fetch_20newsgroups
class sklearn.datasets.fetch_20newsgroups(data_home=None, subset='train', categories=None, shuffle=True, random_state=42, remove=(), download_if_missing=True)"""加载20个新闻组数据集中的文件名和数据:param subset: 'train'或者'test','all',可选,选择要加载的数据集:训练集的“训练”,测试集的“测试”,两者的“全部”,具有洗牌顺序:param data_home: 可选,默认值:无,指定数据集的下载和缓存文件夹。如果没有,所有scikit学习数据都存储在'〜/ scikit_learn_data'子文件夹中:param categories: 无或字符串或Unicode的集合,如果没有(默认),加载所有类别。如果不是无,要加载的类别名称列表(忽略其他类别):param shuffle: 是否对数据进行洗牌:param random_state: numpy随机数生成器或种子整数:param download_if_missing: 可选,默认为True,如果False,如果数据不在本地可用而不是尝试从源站点下载数据,则引发IOError:param remove: 元组"""
In [29]: from sklearn.datasets import fetch_20newsgroupsIn [30]: data_test = fetch_20newsgroups(subset='test',shuffle=True, random_sta...: te=42)In [31]: data_train = fetch_20newsgroups(subset='train',shuffle=True, random_s...: tate=42)
  • sklearn.datasets.fetch_20newsgroups_vectorized
class sklearn.datasets.fetch_20newsgroups_vectorized(subset='train', remove=(), data_home=None)"""加载20个新闻组数据集并将其转换为tf-idf向量,这是一个方便的功能; 使用sklearn.feature_extraction.text.Vectorizer的默认设置完成tf-idf 转换。对于更高级的使用(停止词过滤,n-gram提取等),将fetch_20newsgroup与自定义Vectorizer或CountVectorizer组合在一起:param subset: 'train'或者'test','all',可选,选择要加载的数据集:训练集的“训练”,测试集的“测试”,两者的“全部”,具有洗牌顺序:param data_home: 可选,默认值:无,指定数据集的下载和缓存文件夹。如果没有,所有scikit学习数据都存储在'〜/ scikit_learn_data'子文件夹中:param remove: 元组"""
In [57]: from sklearn.datasets import fetch_20newsgroups_vectorizedIn [58]: bunch = fetch_20newsgroups_vectorized(subset='all')In [59]: from sklearn.utils import shuffleIn [60]: X, y = shuffle(bunch.data, bunch.target)...: offset = int(X.shape[0] * 0.8)...: X_train, y_train = X[:offset], y[:offset]...: X_test, y_test = X[offset:], y[offset:]...:

获取本地生成数据

生成本地分类数据:

  • sklearn.datasets.make_classification

    class make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=2, n_repeated=0, n_classes=2, n_clusters_per_class=2, weights=None, flip_y=0.01, class_sep=1.0, hypercube=True, shift=0.0, scale=1.0, shuffle=True, random_state=None)
    """
    生成用于分类的数据集:param n_samples:int,optional(default = 100),样本数量:param n_features:int,可选(默认= 20),特征总数:param n_classes:int,可选(default = 2),类(或标签)的分类问题的数量:param random_state:int,RandomState实例或无,可选(默认=无)如果int,random_state是随机数生成器使用的种子; 如果RandomState的实例,random_state是随机数生成器; 如果没有,随机数生成器所使用的RandomState实例np.random:return :X,特征数据集;y,目标分类值
    """
    
from sklearn.datasets.samples_generator import make_classification
X,y= datasets.make_classification(n_samples=100000, n_features=20,n_informative=2, n_redundant=10,random_state=42)

生成本地回归数据:

  • sklearn.datasets.make_regression
class make_regression(n_samples=100, n_features=100, n_informative=10, n_targets=1, bias=0.0, effective_rank=None, tail_strength=0.5, noise=0.0, shuffle=True, coef=False, random_state=None)"""生成用于回归的数据集:param n_samples:int,optional(default = 100),样本数量:param  n_features:int,optional(default = 100),特征数量:param  coef:boolean,optional(default = False),如果为True,则返回底层线性模型的系数:param random_state:int,RandomState实例或无,可选(默认=无)如果int,random_state是随机数生成器使用的种子; 如果RandomState的实例,random_state是随机数生成器; 如果没有,随机数生成器所使用的RandomState实例np.random:return :X,特征数据集;y,目标值"""
from sklearn.datasets.samples_generator import make_regression
X, y = make_regression(n_samples=200, n_features=5000, random_state=42)

模型的选择

算法是核心,数据和计算是基础。这句话很好的说明了机器学习中算法的重要性。那么我们开看下机器学习的几种分类:

  • 监督学习

    • 分类 k-近邻算法、决策树、贝叶斯、逻辑回归(LR)、支持向量机(SVM)
    • 回归 线性回归、岭回归
    • 标注 隐马尔可夫模型(HMM)
  • 无监督学习
    • 聚类 k-means

如何选择合适的算法模型

在解决问题的时候,必须考虑下面两个问题:一、使用机器学习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率是对投票者按照兴趣分组;二、需要分析或者收集的数据时什么

首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法,确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,如是/否、1/2/3,A/B/C/或者红/黑/黄等,则可以选择分类算法;如果目标变量是连续的数值,如0.0~100.0、-999~999等,则需要选择回归算法

如果不想预测目标变量的值,则可以选择无监督算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法。

当然在大多数情况下,上面给出的选择办法都能帮助读者选择恰当的机器学习算法,但这也并非已成不变。也有分类算法可以用于回归。

其次考虑的是数据问题,我们应该充分了解数据,对实际数据了解的越充分,越容易创建符合实际需求的应用程序,主要应该了解数据的一下特性:特征值是 离散型变量 还是 连续型变量 ,特征值中是否存在缺失的值,何种原因造成缺失值,数据中是够存在异常值,某个特征发生的频率如何,等等。充分了解上面提到的这些数据特性可以缩短选择机器学习算法的时间。

监督学习中三类问题的解释

(1)分类问题 分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。这时,输入变量可以是离散的,也可以是连续的。监督学习从数据中学习一个分类模型活分类决策函数,称为分类器。分类器对新的输入进行输出的预测,称为分类。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果;除此之外还有多酚类的问题,即在多于两个类别中选择一个。

分类问题包括学习和分类两个过程,在学习过程中,根据已知的训练数据集利用有效的学习方法学习一个分类器,在分类过程中,利用学习的分类器对新的输入实例进行分类。图中(X1,Y1),(X2,Y2)...都是训练数据集,学习系统有训练数据学习一个分类器P(Y|X)或Y=f(X);分类系统通过学习到的分类器对于新输入的实例子Xn+1进行分类,即预测术其输出的雷标记Yn+1

分类在于根据其特性将数据“分门别类”,所以在许多领域都有广泛的应用。例如,在银行业务中,可以构建一个客户分类模型,按客户按照贷款风险的大小进行分类;在网络安全领域,可以利用日志数据的分类对非法入侵进行检测;在图像处理中,分类可以用来检测图像中是否有人脸出现;在手写识别中,分类可以用于识别手写的数字;在互联网搜索中,网页的分类可以帮助网页的抓取、索引和排序。

即一个分类应用的例子,文本分类。这里的文本可以是新闻报道、网页、电子邮件、学术论文。类别往往是关于文本内容的。例如政治、体育、经济等;也有关于文本特点的,如正面意见、反面意见;还可以根据应用确定,如垃圾邮件、非垃圾邮件等。文本分类是根据文本的特征将其划分到已有的类中。输入的是文本的特征向量,输出的是文本的类别。通常把文本的单词定义出现取值是1,否则是0;也可以是多值的,,表示单词在文本中出现的频率。直观地,如果“股票”“银行““货币”这些词出现很多,这个文本可能属于经济学,如果“网球””比赛“”运动员“这些词频繁出现,这个文本可能属于体育类

(2)回归问题

回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,特别是当初如变量的值发生变化时,输出变量的值随之发生的变化。回归模型正式表示从输入到输出变量之间映射的函数。回归稳日的学习等价与函数拟合:选择一条函数曲线使其更好的拟合已知数据且很好的预测位置数据

回归问题按照输入变量的个数,分为一元回归和多元回归;按照输入变量和输出变量之间关系的类型即模型的类型,分为线性回归和非线性回归。

许多领域的任务都可以形式化为回归问题,比如,回归可以用于商务领域,作为市场趋势预测、产品质量管理、客户满意度调查、偷袭风险分析的工具。

(3)标注问题

标注也是一个监督学习问题。可以认为标注问题是分类问题的一个推广,标注问题又是更复杂的结构预测问题的简单形式。标注问题的输入是一个观测序列,输出是一个标记序列或状态序列。标注问题在信息抽取、自然语言处理等领域广泛应用,是这些领域的基本问题。例如,自然语言处理的词性标注就是一个典型的标注,即对一个单词序列预测其相应的词性标记序

当然我们主要关注的是分类和回归问题,并且标注问题的算法复杂

传智播客 sklearn数据集与机器学习组成相关推荐

  1. Ubuntu16.04 ROS 深度学习_传智播客 智能机器人软件开发 学习路线图出炉!首发优惠!!...

    黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 智能机器人软件工程师学习计划 很多朋友对机器人软件开发和人工智能感兴趣,不知道怎么学习,传智播客武汉校区在今年3月 ...

  2. python需要多久-在传智播客培训python需要多久?

    如今,python可以说是比较火的语言之一了,因为灵活以及在人工智能领域上的优势,不少人都转行去培训机构培训python,传智播客的官网上就每天有不少人都在咨询关于python的费用以及时长,今天传智 ...

  3. 与众不同 独树一帜,传智播客2018春季课程发布会在京举行

    2018年4月19日,"传智播客2018春季课程发布会"在北京77文创园召开,传智播客副总裁毕向东.教学研发总监朱景尧.研究院院长于洋.Python课程研发总监邢文鹏.博学谷运营总 ...

  4. 传智python基础 就业_2017传智播客python基础班+就业班

    2017传智播客python基础班+就业班 本课程包含了Python的基础语法和核心编程,以及Python应用中流行的数据库.前端,Web框架,爬虫框架及其分布式策略等技术,包含了丰富的项目案例.适合 ...

  5. 传智播客 - java 就业面试题大全

      从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴迷 ...

  6. 传智播客讲师_技术成果:来自两位全职讲师的播客如何帮助您最终获得编程

    传智播客讲师 科里(右边是我!)和杰夫(犯罪伙伴)在编码训练营Fullstack Academy录制Tech'd Out. 披露: Fullstack学院 ,编码集训,此前曾赞助黑客中午. 我是Cor ...

  7. 传智播客还收费 兄弟会都是免费的

    [传智播客还收费 兄弟会都是免费的 兄弟连兄弟会it开发培训 www.itxdh.net 企鹅群:499956522 高端人才培养就到[兄弟连兄弟会it开发培训]纯免费的高端IT人才培养] 传智播客, ...

  8. ssh中c3p0连接mysql_JSP+SSH+Mysql+C3P0实现的传智播客网上商城

    项目简介 本系统是传智播客授课时的开发案例,基于JSP+SSH+Mysql的简单网上商城.在当代开发中,SSH的使用已经逐渐被SSM取代,但不代表我们不需要学习SSH,该系统简单,但功能齐全可以作为S ...

  9. 2017最新整理传智播客JavaEE第49期 基础就业班

    2017最新整理传智播客JavaEE第49期 基础就业班 可以说是一套不可多的的教程,有条件的同学建议报名培训,效果更佳,没有条件的朋友就买个培训课堂上录制的视频吧. 视频教程推送门:http://b ...

  10. 传智播客C/C++各种开发环境搭建视频工具文档免费教程

    传智播客作为中国IT培训的领军品牌,一直把握技术趋势,给大家带来最新的技术分享!传智播客C/C++主流开发环境免费分享视频文档中,就有写一个helloworld程序的示范.火速前来下载吧 所谓&quo ...

最新文章

  1. DataGridView取得或者修改当前单元格的内容
  2. Linux下用C++开发PHP扩展
  3. 在网站推广的道路中同样的起点,知乎豆瓣却走上了不相交的两条路
  4. 两平面平行方向向量关系_立体几何平行证明的四大必杀绝技------赞!很赞!!非常赞!!!...
  5. java登录的 验证码_java登录验证码
  6. js 进阶篇 代码等级提升
  7. Google Guava EventBus和Java 7 WatchService用于事件编程
  8. MongoDB 宣布已收购数据库托管公司 mLab
  9. quick cocos2dx 组件
  10. 节后上班 北京车辆尾号限行2日轮换
  11. Java命名和java图标来由
  12. 带你深入了解GPU、FPGA和ASIC
  13. Javascript实现手机发送验证码
  14. 苹果操作系统 Mac OS 查看网络中电脑的端口是否开放
  15. 知识图谱中三元组抽取
  16. Download EEGLAB
  17. jdk,jre的下载安装教程
  18. 分布式大矩阵SVD分解
  19. 你可以写出优质的个人简介,自媒体个人简介三要三不要,收藏学习
  20. php 域名纠错,关闭网通域名纠错系统的解决方法(非常管用)

热门文章

  1. nginx代理php不能跳转页面,nginx 解决首页跳转问题详解
  2. python保留小数不四舍五入_Python常用知识小结
  3. 服务器内的虚拟机无法上网,VMware虚拟机中无法上网如何解决
  4. centos下mysql执行命令_CentOS下mysql数据库常用命令总结
  5. vue 为全局变量赋值_在vue项目中 如何定义全局变量 全局函数
  6. mysql与mimic安装_MIMICIII 数据库教程(4)——MIMIC数据库的安装 #丁香打卡#
  7. 如何自动调整代码格式 - vim /Visual Studio/ Source Insight...
  8. 使用SuperWebSocket实现Web消息推送
  9. Rabbitmq 延迟队列
  10. Objective-C写出Json文件(可作配置文件)