一、概述
机器学习是人工智能的实现 方式之一。通过大量数据(数据集)进行建模来辅助决策。重要的过程如下面的公式:
y=f(x)
x代表测试集,y表示预测的结果,f就是建立的模型。y越接近实际情况说明模型越好。可以理解成f是一个函数,x是输入,y是输出,编写一个函数,要求是通过输入x(已知数据)得出接近真实情况的y。
二、基础
数据集
几乎没有用数据库存储的数据集,最常见的数据集文件是.csv格式的。数据集由特征值和目标值组成,特征值是一个一个列字段,比如:单价、品牌等等,目标值是要预测的值,比如:销量。有些数据集可以没有目标值。通常使用pandas读取数据并做基本处理。
特征工程
指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,提高预测的准确性。
数值型数据预处理
归一化:通过对原始数据进行变换把数据映射到(默认[0,1])之间。使某一特征不会对最终数据造成比其它特征更大的影响。
X' = x-min/max-min X'' = X'*(mx-mi)+mi
标准化:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。相对归一化,计算结果不容易受异常点(离群值)的影响。
X'=x-mean/θ 缺失值处理(填补) Imputer(missing_values='NaN',strategy='mean',axis=0) /* sklearn API */
对空值填补列平均值。axis=1的话就是行。
类别型数据
One-Hot编码
事件类型
时间的切分。
数据降维(减少特征数量)
特征选择:选出部分特征,删除低方差的特征。(方差低说明大部分值是差不多的)。sklearn API:
sklearn.feature_selection.VarianceThreshold(threshold = 0.0) # 默认值,将相同的值删除
PAC主成分分析:在不尽量少损失信息的情况下,尽可能降低原数据的维度。sklearn API:
PCA(n_components=0.95) # 代表信息损失比例,小数或者百分数都可,通常90%~95%之间。
算法分类
算法是核心,数据和计算是基础。机器学习里数据类型分为两种:离散型数据、连续型数据。
离散型数据是可以用整数表示且能列举的变量,连续性数据是在一个区间内可以连续不断取值的变量。
网上看到一个很形象的例子:一个寻呼台一个小时接到的电话,虽然是受随机因素影响的变量,而且很大,但可以数清的,可以全部列举出来的,这是离散型随机变量,而一个人高度,因为精度的不同,所以不能列举出来的,这个是连续型变量,还有连续型随机变量也可以按一定顺序排列的,这好比一个人的身高1米5波动,而1个1米6波动,很明显哪个高哪个低。
监督学习(预测)
有特征值和目标值,相当于老师给题目给答案让学生练题。目标值是离散型的就用分类算法,目标值是连续型的就用回归算法。
- 分类 k近邻、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
- 回归 线性回归、岭回归
- 标注 隐马尔可夫模型
无监督学习
只有特征值
- 聚类 k-means
机器学习开发流程
获取数据 -> 明确做什么,建立模型(根据数据类型划分模型种类)-> 数据基本处理(缺失值、合并表)-> 特征工程(筛选特征、标准化、文本转化)-> 选择合适的算法进行预测 -> 模型的评估 -> 使用
转换器与估计器
转换器
- fit_transform()
fit_transform() == fit(data) + transform(data)
fit(data) 输入数据
transform() 计算平均值、方差等。将数据转换成合适的数据。
估计器
估计器(estimator)是一类实现了算法的API
用于分类的估计器
sklearn.neighbors knn
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树与随机森林
用于回归的估计器
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
用于无监督学习的估计器
sklearn.cluster.KMeans 聚类
K-近邻(KNN)
用一个数据和K个邻居(接近的点),几个数据中多数邻居的类别是什么,它的类别iu是什么。判断相近是依靠距离,距离通过距离公式得出。因为相似的样本,特征之间的值是相近的。
需要做标准化处理。
sklearn API:
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors: K取值,int型,可选(默认5),k_neighbors查询默认使用的邻居数。
algorithm:{'auto','ball_tree','kd_tree','brute'},可选用于计算最近邻居的算法:'ball_tree'会使用BallTree,'kd_tree'会使用KDTree。'auto'将尝试根据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)。
K值取小的话容易受异常点影响。K值取大也容易受类别波动。
-
优点
- 简单,容易实现,不用训练,不用估计参数。
-
缺点
- 计算量大,开销大。必须指定K值,K值选择不当则分类精度不能保证。适合数据量不大的场景(几千~几万)。
朴素贝叶斯
“朴素”的意思是,这个算法更适合特征独立时使用,常用的分类算法。如果训练集误差大,结果肯定不好。
概率基础
概率定义为一件事情发生的可能性。
- 联合概率 包含多个条件,且所有条件同时成立的概率。
P(A,B)
P(A,B) = P(A)P(B)
- 条件概率 时间A在另一个时间B已经发生条件下的发生概率
P(A|B)
P(A1,A2|B) = P(A1|B)P(A2|B)
- 贝叶斯公式(单纯调API了解就行)
P(C|W) = P(W|C)P(C)/P(W)
P(C|F1,F2,...) = p(F1,F2,...|C)P(C)/P(F1,F2,...)
- 拉普拉斯平滑 有时计算概率为0,可能并不合理。为了解决这个问题,可以用拉普拉斯平滑系数。计算概率是在分子分母都加上一个数,保证结果不为0。
sklearn API:
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
alpha就是拉普拉斯平滑系数,防止类别概率为0。
- 优点
- 有稳定的分类效率。
- 对确实数据不敏感,常用于文本分类。
- 分类准确度高,速度快。
- 缺点
- 使用了样本独立性的假设,如果特征之间有关联的话效果没那么好。
分类模型的评估
- 准确率 以二分类为例。评估的标准通常使用准确率,就是预测对的/所有。
- 召回率
预测结果为正例(预测为某一类为真实情况的概率)的比例,比如一个判断是否确诊的模型,一定要保证尽量不放过确诊的样本。
- F1-score,反应模型稳健性。
sklearn API
# 得到精确率(通常用不上)、准确率和召回率。
sklearn.metrics.classification_report(y_true,y_pred,target_names=None)
x_true:真实目标值
y_pred:估计器预测目标值
target_names:目标类别名称
交叉验证和网格搜索
交叉验证
将所有数据分成n等份,相当于所有数据都当过训练集和测试集。分成n份,就叫n折交叉验证。这样可以保证准确率的可信度。它们的准确率的平均值就是模型结果。
网格搜索
很多算法有需要手动设定的参数(比如K近邻的K值),这种参数叫超参数。通常对模型预设几种超参数组合。每组超参数都采用交叉验证进行评估。最后选出最优参数组合建立模型。
sklearn API
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
# 对估计器的指定参数值进行搜索
estimator:估计器对象
param_grid:估计器参数(dict){"n_neighbors":[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率。
best_score_:交叉验证当中最好的结果。
best_estimator_:最好的模型。
cv_results_:每个超参数每次交叉验证的结果。
决策树
类似if-then结构。一颗树的顶点是最能帮助消除不确定性的问题。再往下延伸节点,每个节点都使问题更接近结果。越下面的节点能消除的不确定性越少。
信息熵
- 不确定性越大,信息熵越大。
- 信息熵只反映内容的随机性,与内容本身无关。
- 信息熵越大,表示占用的二进制位越长,可以表达更多的符号。
- 阮一峰老师文章
信息增益
那么哪个特征作为树顶点,以及在某个特征之上还是之下?其中一个依据是通过信息增益决定。得知一个特征条件后,减少的信息熵的大小就是信息增益。
sklearn API
sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)
criterion:默认是基尼系数,也可以选择信息增益的熵'entropy'。
max_depth:树的深度大小。
random_state:随机数种子。
decision_path:返回决策树的路径
- 优点
- 易于理解,数目可视化
- 不需要花大量时间在数据预处理
- 缺点
- 数据过于复杂的话容易过度拟合(测试集准确率高,其它数据准确率没那么高)
随机森林
集成学习方法
生成多个分类器/模型,说白了就是用多种算法混合在一起各自独立的做预测。最后结合成一个预测。
随机森林定义
包含多个决策树的分类器,最终预测结果由每个树得出结果的众数决定。
建立多个决策树的过程
- 单个树的建立过程:
- 在N个样本中随机选择一个样本,重复N次。样本有可能重复。
- 随机在M个特征中选出m个特征
sklearn API
sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None)
n_estimators:森林里的树木数量,默认是10.(通常:120、200、300、500、800、1200)
max_depth:树的最大深度。(通常:5、8、15、25、30)
max_features="auto",每个决策树的最大特征数量。
bootstrap:是否在建立决策树的时候使用bootstrap抽样(随机有返回的抽样。随机是为了避免每次建立的决策树都一样,放回是为了样本被抽取完。)。
- 优点
- 准确率高
- 适合在样本数和特征数多的数据集运行
- 适合处理高维特征的输入样本,不需要降维
- 能够评估每个特征的重要性
线性回归
通过多个特征和目标值之间的关系进行建模的回归分析,找出每个特征对结果影响的权重。在二维中是直线关系,三维中是平面关系。比如预测成绩,给出3个成绩预测出最终成绩。求出每个成绩的权重就很容易算出最终成绩。
f(x) = w1x1 + w2x2 + ··· + wd*xd + b # b 是偏置,单个特征的情况下更通用。
一元线性回归指的是只有一个特征,一个目标值。多元线性回归指两个或者多个特征的。
矩阵
大多数算法的计算基础。必须是二维的。为了满足特定运算需求而存在。最大运算需求就是矩阵乘法。推荐看[阮一峰老师文章]。(www.ruanyifeng.com/blog/2015/0…)
(m行,1列) * (1行,n列) = (m行,n列)
损失函数
就是将每个预测值与真实值的误差的平方和,最终就是总损失。优化损失函数就是为了找到能造成最小误差的w(每个特征的权重)。