赞
踩
在传统编程中,你需要对程序的行为进行硬编码。对于任何解决方案,第一个任务都是创建最合适的算法并编写代码。然后,必须设置输入参数,实际上,如果实现的算法是正确的,它将产生预期的结果。如下面流程图所示,在传统编程中,在对问题进行研究之后,对解决方案按照编写规则进行代码编写,之后对代码、算法进行评估。如果理想,正常运行从而产生预期的结果,如果不理想;分析错误重新对问题进行研究分析。
在机器学习中,你将大量内容留给机器去学习数据。机器学习的一个显著特征是不需要构建模型。这个复杂而有意义的任务是由机器学习算法执行的。如下图所示,与传统编程最大的区别在于机器学习把数据交给机器进行学习,而传统编程由程序员自己编写。
在我们进行机器学习时,数据是一般都会发生一些变化,比如说,产生一些新的数据,那我们就需要对数据进行一定的升级,然后对升级之后的数据重新进行训练。如果,我们按照之前的方法,需要的步骤就比较多,而且比较麻烦。我们可以对整个流程进行升级,让机器去适应这个流程,这样可以大大的减少我们工作。
应用机器学习技术来训练海量数据,可以帮助我们发 现那些此前并非立见端倪的模式,称为数据挖掘。
机器学习是指:让机器可以自主获得事物规律。要让机器可以 “学习”,必须将生活中的数据(包括但不限于图像、文字、语音)数值化,将不同事物的变化和关联转化为运算。
机器学习可以成立的原因是:概念和数值、关系和运算可以相互映射
机器学习三要素之数据、模型、算法
我们通过下面的例子来加深对机器学习原理的学习。
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。
下图是对知识掌握与前景发展的大体结构图。
让机器像人一样看世界,看到图像,视频等媒体。会把图像进行识别,分类。
与机器进行语音交流,让机器明白你说什么
让机器像人一样理解语言,理解人写的文字等的含义。并作出一定的反应。
推荐系统主要解决信息过载的问题。它有两个目的:一是让用户找到感兴趣的物品;二是让物品出现在对它感兴趣的用户前。
数据挖掘主要是应用于大数据领域,利用机器学习的模型来挖掘数据中的潜在价值。发现数据之间的关系。
给机器各种特征描述,从而让机器对未知的事物进行判断
机器学习分为四种,分别是监督学习、无监督学习、半监督学习和增强学习。使用比较多的的是监督学习与无监督学习。
在解决问题的时候,必须考虑下面两个问题:一、使用机器学习算法的目的,想要算法完成何种任务;二、需要分析或者收集的数据是什么。
首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法,确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,则可以选择分类算法;如果目标变量是连续的数值,则需要选择回归算法。
如果不想预测目标变量的值,则可以选择无监督算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法。
利用无标签的数据学习数据的分布或数据与数 据之间的关系被称作无监督学习,也就是说,通过过往的一些数据的特征以及最终结果来进行训练的方式就是监督学习法,监督学习算法的训练数据源需要由特征值以及目标队列两部分组成。
用来训练模型,估计参数
用来测试和评估训练出来的模型好坏,不能用于训练模型
监督学习是从标记的训练数据来推断一个功能的机器学习任务。然后使用预测数据对训练出来的模型进行验证。
监督学习依赖于每个样本,可以得到每个特征序列映射到的确切的目标值是什么,所以常用于回归以及分类场景。常见的监督学习算法有:K近邻、朴素贝叶斯、决策树、随机森林、逻辑回归、线性回归、支持向量机SVM等。
KNN法即K近邻法,它的思路非常简单:找到训练集样本空间中的K个距离预测样本x最近的点,统计K个距离最近的点的类别,找出个数最多的类别,将x归入该类别。
本案例使用最著名的”鸢尾“数据集,该数据集曾经被Fisher用在经典论文中,目前作为教科书般的数据样本预存在Scikit-learn的工具包中。
from sklearn.datasets import load_iris from sklearn.cross_validation import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import classification_report from sklearn.model_selection import GridSearchCV def knniris(): """ 鸢尾花分类 :return: None """ # 数据集获取和分割 lr = load_iris() x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, test_size= 0.25) # 进行标准化 std = StandardScaler() x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # estimator流程 knn = KNeighborsClassifier() # # 得出模型 # knn.fit(x_train,y_train) # # # 进行预测或者得出精度 # y_predict = knn.predict(x_test) # # # score = knn.score(x_test,y_test) # 通过网格搜索,n_neighbors为参数列表 param = { "n_neighbors": [3, 5, 7]} gs = GridSearchCV(knn, param_grid= param, cv= 10) # 建立模型 gs.fit(x_train,y_train) # print(gs) # 预测数据 print(gs.score(x_test,y_test)) # 分类模型的精确率和召回率 # print("每个类别的精确率与召回率:",classification_report(y_test, y_predict,target_names=lr.target_names)) return None if __name__ == "__main__": knniris()
朴素贝叶斯(Naive Bayes)是一个非常简单,但是实用性很强的分类模型。朴素贝叶斯分类器的构造基础是贝叶斯理论。朴素贝叶斯分类器的主要思路:通过联合概率P(x,y)=P(x|y)P(y)建模,运用贝叶斯定理求解后验概率P(y|x);将后验概率最大者对应的的类别作为预测类别,因为后验概率最大化,可以使得期望风险最小化。
# 读取20类新闻文本的数据细节 from sklearn.datasets import fetch_20newsgroups news = fetch_20newsgroups(subset= 'all') # 20类新闻文本数据分割 from sklearn.cross_validation import train_test_split X_train,X_test,y_train,y_test = train_test_split(news.data, news.target, test_size= 0.25,random_state= 42) # 文本转换为特征向量进行TF特征抽取 from sklearn.feature_extraction.text import CountVectorizer vec = CountVectorizer() # 训练数据输入,并转换为特征向量 X_train = vec.fit_transform(X_train) print(X_train) # 测试数据转换 X_test = vec.transform(X_test) print(X_test) # 朴素贝叶斯分类器对文本数据进行类别预测 from sklearn.naive_bayes import MultinomialNB # 使用平滑处理初始化的朴素贝叶斯模型 mnb = MultinomialNB(alpha=1.0) # 利用训练数据对模型参数进行估计 mnb.fit(X_train,y_train) # 对测试验本进行类别预测。结果存储在变量y_predict中 y_predict = mnb.predict(X_test) print(y_predict)
决策树(decision tree)归纳是经典的分类算法。它采用自顶向下递归的方式构造决策树。可以从生成的决策树中提取规则。通常决策树学习包括三个步骤:决策树的生成和决策树的修剪。决策树的优缺点
优点:
缺点:
import pandas as pd import sklearn from sklearn.cross_validation import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') #选取一些特征作为我们划分的依据 x = titanic[['pclass', 'age', 'sex']] y = titanic['survived'] # 填充缺失值 x['age'].fillna(x['age'].mean(), inplace= True) # 分割数据集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.25) dt = DictVectorizer(sparse= False) print(x_train.to_dict(orient= "record")) # 按行,样本名字为键,列名也为键,[{"1":1,"2":2,"3":3}] x_train = dt.fit_transform(x_train.to_dict(orient= "record")) x_test = dt.fit_transform(x_test.to_dict(orient= "record")) # 使用决策树 dtc = DecisionTreeClassifier() dtc.fit(x_train, y_train) dt_predict = dtc.predict(x_test) print(dtc.score(x_test, y_test)) print(classification_report(y_test, dt_predict, target_names= ["died", "survived"]))
随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。个标准的决策树会根据每维特征对预测结果的影响程度进行排序,进而决定不同的特征从上至下构建分裂节点的顺序,如此以来,所有在随机森林中的决策树都会受这一策略影响而构建的完全一致,从而丧失的多样性。所以在随机森林分类器的构建过程中,每一棵决策树都会放弃这一固定的排序算法,转而随机选取特征。
根据下列算法而建造每棵树:
import pandas as pd import sklearn from sklearn.cross_validation import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') # 选取一些特征作为我们划分的依据 x = titanic[['pclass', 'age', 'sex']] y = titanic['survived'] # 填充缺失值 x['age'].fillna(x['age'].mean(), inplace= True) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.25) dt = DictVectorizer(sparse= False) print(x_train.to_dict(orient= "record")) # 按行,样本名字为键,列名也为键,[{"1": 1, "2": 2, "3": 3}] x_train = dt.fit_transform(x_train.to_dict(orient= "record")) x_test = dt.fit_transform(x_test.to_dict(orient= "record")) # 使用随机森林 rfc = RandomForestClassifier() rfc.fit(x_train, y_train) rfc_y_predict = rfc.predict(x_test) print(rfc.score(x_test, y_test)) print(classification_report(y_test, rfc_y_predict, target_names= ["died", "survived"]))
逻辑回归(Logistic Regression),简称LR。它的特点是能够使我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用逻辑回归。了解过线性回归之后再来看逻辑回归可以更好的理解。原始数据的下载地址为:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/
Logistic回归优点:
缺点:
import numpy as np import pandas as pd from sklearn.metrics import roc_auc_score from sklearn.preprocessing import StandardScaler # 标准化 from sklearn.linear_model import LogisticRegression # 逻辑回归 from sklearn.metrics import classification_report # 召回率 from sklearn.model_selection import train_test_split # 训练集 测试集 拆分 # 加载数据 data = pd.read_csv('data/breast-cancer-wisconsin.data', header= None) # 列名称 columns = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'SingleEpithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class'] data.columns = columns print(data) # 缺失值处理 data.replace('?',np.nan, inplace= True) # 检测缺失值 res_null = data.isnull().sum() # 删除缺失值 data.dropna(axis= 0, how= 'any', inplace= True) # 进行筛选数据集 --- 去除编号的第一列 data = data.iloc[:,1:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。