电子商务网站规划流程,织梦网站如何做二级导航,app平台搭建步骤,什么网站可以看女人唔易做机器学习组成#xff1a;模型、策略、优化
《统计机器学习》中指出#xff1a;机器学习模型策略算法。其实机器学习可以表示为#xff1a;Learning RepresentationEvalutionOptimization。我们就可以将这样的表示和李航老师的说法对应起来。机器学习主要是由三部分组成…机器学习组成模型、策略、优化
《统计机器学习》中指出机器学习模型策略算法。其实机器学习可以表示为Learning RepresentationEvalutionOptimization。我们就可以将这样的表示和李航老师的说法对应起来。机器学习主要是由三部分组成即表示(模型)、评价(策略)和优化(算法)。
表示(或者称为模型)Representation
表示主要做的就是建模故可以称为模型。模型要完成的主要工作是转换将实际问题转化成为计算机可以理解的问题就是我们平时说的建模。类似于传统的计算机学科中的算法数据结构如何将实际的问题转换成计算机可以表示的方式。这部分可以见“简单易学的机器学习算法”。给定数据我们怎么去选择对应的问题去解决选择正确的已有的模型是重要的一步。
评价(或者称为策略)Evalution
评价的目标是判断已建好的模型的优劣。对于第一步中建好的模型评价是一个指标用于表示模型的优劣。这里就会是一些评价的指标以及一些评价函数的设计。在机器学习中会有针对性的评价指标。
分类问题
优化Optimization
优化的目标是评价的函数我们是希望能够找到最好的模型也就是说评价最高的模型。
开发机器学习应用程序的步骤
1收集数据
我们可以使用很多方法收集样本护具如制作网络爬虫从网站上抽取数据、从RSS反馈或者API中得到信息、设备发送过来的实测数据。
2准备输入数据
得到数据之后还必须确保数据格式符合要求。
3分析输入数据
这一步的主要作用是确保数据集中没有垃圾数据。如果是使用信任的数据来源那么可以直接跳过这个步骤
4训练算法
机器学习算法从这一步才真正开始学习。如果使用无监督学习算法由于不存在目标变量值故而也不需要训练算法所有与算法相关的内容在第5步
5测试算法
这一步将实际使用第4步机器学习得到的知识信息。当然在这也需要评估结果的准确率然后根据需要重新训练你的算法
6使用算法
转化为应用程序执行实际任务。以检验上述步骤是否可以在实际环境中正常工作。如果碰到新的数据问题同样需要重复执行上述的步骤一、scikit-learn数据集我们将介绍sklearn中的数据集类模块包括用于加载数据集的实用程序包括加载和获取流行参考数据集的方法。它还具有一些人工数据生成器。sklearn.datasets1datasets.load_*()获取小规模数据集数据包含在datasets里2datasets.fetch_*()获取大规模数据集需要从网络上下载函数的第一个参数是data_home表示数据集下载的目录默认是 ~/scikit_learn_data/要修改默认目录可以修改环境变量SCIKIT_LEARN_DATA3datasets.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_homeNone)删除所有下载数据datasets.get_data_home(data_homeNone)返回scikit学习数据目录的路径。这个文件夹被一些大的数据集装载器使用以避免下载数据。默认情况下数据目录设置为用户主文件夹中名为“scikit_learn_data”的文件夹。或者可以通过“SCIKIT_LEARN_DATA”环境变量或通过给出显式的文件夹路径以编程方式设置它。〜符号扩展到用户主文件夹。如果文件夹不存在则会自动创建。sklearn.datasets.clear_data_home(data_homeNone)删除存储目录中的数据获取小数据集用于分类sklearn.datasets.load_irisclass sklearn.datasets.load_iris(return_X_yFalse)加载并返回虹膜数据集:param return_X_y: 如果为True则返回而不是Bunch对象默认为False:return: Bunch对象如果return_X_y为True那么返回tupledata,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每个类别数量50sklearn.datasets.load_digitsclass sklearn.datasets.load_digits(n_class10, return_X_yFalse)加载并返回数字数据集:param n_class: 整数介于0和10之间可选默认 10要返回的类的数量:param return_X_y: 如果为True则返回而不是Bunch对象默认为False:return: Bunch对象如果return_X_y为True那么返回tupledata,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_bostonclass sklearn.datasets.load_boston(return_X_yFalse)加载并返回波士顿房价数据集:param return_X_y: 如果为True则返回而不是Bunch对象默认为False:return: Bunch对象如果return_X_y为True那么返回tupledata,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样本数量506sklearn.datasets.load_diabetesclass sklearn.datasets.load_diabetes(return_X_yFalse)加载和返回糖尿病数据集:param return_X_y: 如果为True则返回而不是Bunch对象默认为False:return: Bunch对象如果return_X_y为True那么返回tupledata,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_20newsgroupsclass sklearn.datasets.fetch_20newsgroups(data_homeNone, subsettrain, categoriesNone, shuffleTrue, random_state42, remove(), download_if_missingTrue)加载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(subsettest,shuffleTrue, random_sta...: te42)In [31]: data_train fetch_20newsgroups(subsettrain,shuffleTrue, random_s...: tate42)
sklearn.datasets.fetch_20newsgroups_vectorizedclass sklearn.datasets.fetch_20newsgroups_vectorized(subsettrain, remove(), data_homeNone)加载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(subsetall)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_classificationclass make_classification(n_samples100, n_features20, n_informative2, n_redundant2, n_repeated0, n_classes2, n_clusters_per_class2, weightsNone, flip_y0.01, class_sep1.0, hypercubeTrue, shift0.0, scale1.0, shuffleTrue, random_stateNone)生成用于分类的数据集:param n_samples:intoptionaldefault 100)样本数量:param n_features:int可选默认 20特征总数:param n_classes:int可选default 2),类或标签的分类问题的数量:param random_state:intRandomState实例或无可选默认无如果intrandom_state是随机数生成器使用的种子; 如果RandomState的实例random_state是随机数生成器; 如果没有随机数生成器所使用的RandomState实例np.random:return :X,特征数据集y,目标分类值from sklearn.datasets.samples_generator import make_classification
X,y datasets.make_classification(n_samples100000, n_features20,n_informative2, n_redundant10,random_state42)
生成本地回归数据sklearn.datasets.make_regressionclass make_regression(n_samples100, n_features100, n_informative10, n_targets1, bias0.0, effective_rankNone, tail_strength0.5, noise0.0, shuffleTrue, coefFalse, random_stateNone)生成用于回归的数据集:param n_samples:intoptionaldefault 100)样本数量:param n_features:int,optionaldefault 100)特征数量:param coef:booleanoptionaldefault False如果为True则返回底层线性模型的系数:param random_state:intRandomState实例或无可选默认无如果intrandom_state是随机数生成器使用的种子; 如果RandomState的实例random_state是随机数生成器; 如果没有随机数生成器所使用的RandomState实例np.random:return :X,特征数据集y,目标值
from sklearn.datasets.samples_generator import make_regression
X, y make_regression(n_samples200, n_features5000, random_state42)二、模型的选择算法是核心数据和计算是基础。这句话很好的说明了机器学习中算法的重要性。那么我们开看下机器学习的几种分类监督学习分类 k-近邻算法、决策树、贝叶斯、逻辑回归(LR)、支持向量机(SVM)回归 线性回归、岭回归标注 隐马尔可夫模型(HMM)无监督学习聚类 k-means如何选择合适的算法模型在解决问题的时候必须考虑下面两个问题一、使用机器学习算法的目的想要算法完成何种任务比如是预测明天下雨的概率是对投票者按照兴趣分组二、需要分析或者收集的数据时什么首先考虑使用机器学习算法的目的。如果想要预测目标变量的值则可以选择监督学习算法否则可以选择无监督学习算法确定选择监督学习算法之后需要进一步确定目标变量类型如果目标变量是离散型如是否、1/2/3A/B/C/或者红黑黄等则可以选择分类算法如果目标变量是连续的数值如0.0100.0、-999999等则需要选择回归算法如果不想预测目标变量的值则可以选择无监督算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求则使用聚类算法。当然在大多数情况下上面给出的选择办法都能帮助读者选择恰当的机器学习算法但这也并非已成不变。也有分类算法可以用于回归。其次考虑的是数据问题我们应该充分了解数据对实际数据了解的越充分越容易创建符合实际需求的应用程序主要应该了解数据的一下特性特征值是 离散型变量 还是 连续型变量 特征值中是否存在缺失的值何种原因造成缺失值数据中是够存在异常值某个特征发生的频率如何等等。充分了解上面提到的这些数据特性可以缩短选择机器学习算法的时间。监督学习中三类问题的解释1分类问题分类是监督学习的一个核心问题在监督学习中当输出变量取有限个离散值时预测问题变成为分类问题。这时输入变量可以是离散的也可以是连续的。监督学习从数据中学习一个分类模型活分类决策函数称为分类器。分类器对新的输入进行输出的预测称为分类。最基础的便是二分类问题即判断是非从两个类别中选择一个作为预测结果除此之外还有多酚类的问题即在多于两个类别中选择一个。分类问题包括学习和分类两个过程在学习过程中根据已知的训练数据集利用有效的学习方法学习一个分类器在分类过程中利用学习的分类器对新的输入实例进行分类。图中(X1,Y1),(X2,Y2)...都是训练数据集学习系统有训练数据学习一个分类器P(Y|X)或Yf(X);分类系统通过学习到的分类器对于新输入的实例子Xn1进行分类即预测术其输出的雷标记Yn1分类在于根据其特性将数据“分门别类”所以在许多领域都有广泛的应用。例如在银行业务中可以构建一个客户分类模型按客户按照贷款风险的大小进行分类在网络安全领域可以利用日志数据的分类对非法入侵进行检测在图像处理中分类可以用来检测图像中是否有人脸出现在手写识别中分类可以用于识别手写的数字在互联网搜索中网页的分类可以帮助网页的抓取、索引和排序。即一个分类应用的例子文本分类。这里的文本可以是新闻报道、网页、电子邮件、学术论文。类别往往是关于文本内容的。例如政治、体育、经济等也有关于文本特点的如正面意见、反面意见还可以根据应用确定如垃圾邮件、非垃圾邮件等。文本分类是根据文本的特征将其划分到已有的类中。输入的是文本的特征向量输出的是文本的类别。通常把文本的单词定义出现取值是1否则是0也可以是多值的表示单词在文本中出现的频率。直观地如果“股票”“银行““货币”这些词出现很多这个文本可能属于经济学如果“网球””比赛“”运动员“这些词频繁出现这个文本可能属于体育类2回归问题回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系特别是当初如变量的值发生变化时输出变量的值随之发生的变化。回归模型正式表示从输入到输出变量之间映射的函数。回归稳日的学习等价与函数拟合选择一条函数曲线使其更好的拟合已知数据且很好的预测位置数据回归问题按照输入变量的个数分为一元回归和多元回归按照输入变量和输出变量之间关系的类型即模型的类型分为线性回归和非线性回归。许多领域的任务都可以形式化为回归问题比如回归可以用于商务领域作为市场趋势预测、产品质量管理、客户满意度调查、偷袭风险分析的工具。3标注问题标注也是一个监督学习问题。可以认为标注问题是分类问题的一个推广标注问题又是更复杂的结构预测问题的简单形式。标注问题的输入是一个观测序列输出是一个标记序列或状态序列。标注问题在信息抽取、自然语言处理等领域广泛应用是这些领域的基本问题。例如自然语言处理的词性标注就是一个典型的标注即对一个单词序列预测其相应的词性标记序当然我们主要关注的是分类和回归问题并且标注问题的算法复杂 三、模型检验-交叉验证一般在进行模型的测试时我们会将数据分为训练集和测试集。在给定的样本空间中拿出大部分样本作为训练集来训练模型剩余的小部分样本使用刚建立的模型进行预测。训练集与测试集训练集与测试集的分割可以使用cross_validation中的train_test_split方法大部分的交叉验证迭代器都内建一个划分数据前进行数据索引打散的选项train_test_split 方法内部使用的就是交叉验证迭代器。默认不会进行打散包括设置cvsome_integer直接k折叠交叉验证的cross_val_score会返回一个随机的划分。如果数据集具有时间性千万不要打散数据再划分sklearn.cross_validation.train_test_splitdef train_test_split(*arrays,**options):param arrays:允许的输入是列表数字阵列:param test_size:floatint或None默认为无,如果浮点数应在0.0和1.0之间并且表示要包括在测试拆分中的数据集的比例。如果int表示测试样本的绝对数:param train_size:floatint或None默认为无,如果浮点数应在0.0到1.0之间表示数据集包含在列车拆分中的比例。如果int表示列车样本的绝对数:param random_state:int或RandomState,用于随机抽样的伪随机数发生器状态参数 random_state 默认设置为 None这意为着每次打散都是不同的。
from sklearn.cross_validation import train_test_split
from sklearn import datasetsiris datasets.load_iris()
print iris.data.shape,iris.target.shape
X_train, X_test, y_train, y_test train_test_split(iris.data, iris.target, test_size0.4, random_state42)
print X_train.shape,y_train.shape
print X_test.shape,y_test.shape
上面的方式也有局限。因为只进行一次测试并不一定能代表模型的真实准确率。因为模型的准确率和数据的切分有关系在数据量不大的情况下影响尤其突出。所以还需要一个比较好的解决方案。模型评估中除了训练数据和测试数据还会涉及到验证数据。使用训练数据与测试数据进行了交叉验证只有这样训练出的模型才具有更可靠的准确率也才能期望模型在新的、未知的数据集上能有更好的表现。这便是模型的推广能力也即泛化能力的保证。holdout method评估模型泛化能力的典型方法是holdout交叉验证(holdout cross validation)。holdout方法很简单我们只需要将原始数据集分割为训练集和测试集前者用于训练模型后者用于评估模型的性能。一般来说Holdout 验证并非一种交叉验证因为数据并没有交叉使用。 随机从最初的样本中选出部分形成交叉验证数据而剩余的就当做训练数据。 一般来说少于原本样本三分之一的数据被选做验证数据。所以这种方法得到的结果其实并不具有说服性k-折交叉验证K折交叉验证初始采样分割成K个子样本一个单独的子样本被保留作为验证模型的数据其他K-1个样本用来训练。交叉验证重复K次每个子样本验证一次平均K次的结果或者使用其它结合方式最终得到一个单一估测。这个方法的优势在于同时重复运用随机产生的子样本进行训练和验证每次的结果验证一次10折交叉验证是最常用的。例如5折交叉验证全部可用数据集分成五个集合每次迭代都选其中的1个集合数据作为验证集另外4个集合作为训练集经过5组的迭代过程。交叉验证的好处在于可以保证所有数据都有被训练和验证的机会也尽最大可能让优化的模型性能表现的更加可信。使用交叉验证的最简单的方法是在估计器和数据集上使用cross_val_score函数。sklearn.cross_validation.cross_val_scoredef cross_val_score(estimator, X, yNone, groupsNone, scoringNone, cvNone, n_jobs1, verbose0, fit_paramsNone, pre_dispatch2*n_jobs):param estimator:模型估计器:param X:特征变量集合:param y:目标变量:param cv:int使用默认的3折交叉验证整数指定一个分层KFold中的折叠数:return :预估系数
from sklearn.cross_validation import cross_val_score
diabetes datasets.load_diabetes()
X diabetes.data[:150]
y diabetes.target[:150]
lasso linear_model.Lasso()
print(cross_val_score(lasso, X, y))
使用交叉验证方法的目的主要有2个从有限的学习数据中获取尽可能多的有效信息可以在一定程度上避免过拟合问题。四、estimator的工作流程
在sklearn中估计器(estimator)是一个重要的角色分类器和回归器都属于estimator。在估计器中有有两个重要的方法是fit和transform。
fit方法用于从训练集中学习模型参数transform用学习到的参数转换数据