本篇 文章 是 原文 的译文,然后自己对其间做了一些修正和添加内容(随机森林和降维算法)。文章简练地介绍了机器学习的首要算法和一些伪 代码 ,关于 初学者 有很大协助,是一篇不错的 总结 文章,后期可以经过文中说到的算法打开去做一些实践问题。
导言
Google 的自驾车和机器人得到了许多新闻,但公司的真实未来是机器学习,这种技能使核算机变得更 智能 ,更个性化。-Eric Schm id t (Google Chair man)
咱们或许生活在人类前史上最具影响力的时期——核算从大型 主机 到PC移动到 云 核算的时期。 可是使这段时期有意义的不是产生了什么,而是在未来几年里咱们的办法。
这个时期令像我这样的一个人振奋的便是,跟着核算机的推动,东西和技能的民主化。 今日,作为 数据科学 家,我可以每小时为几个玩偶构建具有杂乱算法的 数据 处理机。 但抵达这儿并不简略,我现已度过了许多漆黑的日日夜夜。
谁可以从本攻略中获益最多
我今日发布的或许是我发明的最有价值的攻略。
创立本攻略背面的理念是简化全球有志向的数据科学家和机器学习爱好者的旅程。 本攻略可以使你在研讨机器学习问题的进程中获取阅历。 我供给了关于各种机器学习算法以及R&Python代码的高档了解以及运转它们,这些应该足以使你得心随手。
machine learning
我成心跳过了这些技能背面的 核算 数据,因为你不需求在开端时就了解它们。 所以,假设你正在寻觅对这些算法的核算学了解,你应该看看其他文章。 可是,假设你正在寻觅并开端构建机器学习项目,那么这篇文章给你带来极大优点。
3类机器学习算法(广义上)
监督学习
作业原理 :该算法由一组方针/成果变量(或因变量)组成,该变量将依据给定的一组猜测变量(独立变量)进行猜测。 运用这些变量集,咱们生成一个将输入映射到所需输出的函数。 练习进程继续进行履行,直到 模型 到达培训数据所需的精确度水平。 监督学习的比方:回归,决议计划树,随机森林,KNN,逻辑回归等
无监督学习
怎么作业:在这个算法中,咱们没有任何方针或成果变量来猜测/估量。 用于不同集体的集体聚类和用于不同集体的客户进行特定干涉。 无监督学习的比方:Apriori算法,K-means。
加强学习:
作业原理:运用这种算法,机器遭到学习和练习,作出具体决议。 它以这种办法作业:机器暴露在一个环境中,它接连不断地运用试错。 该机器从曩昔的阅历中学习,并检验捕获最好的常识,以做出精确的事务决议计划。 加强学习示例:马尔可夫决议计划进程
常见机器学习算法
以下是常用机器学习算法的列表。 这些算法简直可以运用于任何数据问题:
线性回归
逻辑回归
决议计划树
SVM
朴素贝叶斯
KNN
K-Means
随机森林
降维算法
Gradient Boost&Adaboost
1.线性回归
它用于依据接连变量来估量实践价值(房子本钱,电话数量,总销售额等)。在这儿,咱们经过拟合最佳线来树立独立变量和因变量之间的联系。这个最佳拟合线被称为回归线,由线性方程Y = a * X + b表明。
了解线性回归的最好办法是回想幼年的阅历。比方,你要求五年级的孩子经过体重来从小到大排序班里的 学生 ,而事前不告知学生们的体重!你以为孩子会做什么?他/她很或许在身高和体魄上剖析 人物 的体重,并运用这些可视 参数 的组合进行摆放。这是现实生活中的线性回归!孩子实践上现已弄清楚,身高和体魄将有一个联系与体重相关联,看起来就像上面的等式。
在这个方程式中:
Y-因变量
a – 斜率
X – 自变量
b – 截距
这些系数a和b是依据最小化数据点和回归线之间的间隔的平方差之和导出的。
看下面的比方。这儿咱们确认了线性方程y = 0.2811x + 13.9的最佳拟合线。现在运用这个方程,咱们可以找到一个人(身高已知)的体重。
线性回归
线性回归首要有两种类型:简略线性回归和多元线性回归。 简略线性回归的特征在于一个自变量。 并且,多元线性回归(望文生义)的特征是多个(多于1个)自变量。 在找到最佳拟合线的一同,可以拟合多项式或曲线回归线,这些被称为多项式或曲线回归。
Python Code
#Import Library
#Import other necessary libraries like pandas, numpy…
from sklearn import linear_model
import numpy as np
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
# x_train=input_variables_values_training_datasets
x_train=np.random.rand(4,4)
print(x_train)
# y_train=target_variables_values_training_datasets
y_train=np.random.rand(4,4)
print(y_train)
# x_test=input_variables_values_test_datasets
x_test=np.random.rand(4,4)
print(x_test)
# Create linear regression object
linear = linear_model.LinearRegression()
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
#Equation coefficient and Intercept
print('Coefficient: /n', linear.coef_)
print('Intercept: /n', linear.intercept_)
#Predict Output
predicted= linear.predict(x_test)
print('predicted:/n',predicted)
[[ 0.98267731 0.23364069 0.35133775 0.92826309]
[ 0.80538991 0.05637806 0.87662175 0.3960776 ]
[ 0.54686738 0.6816495 0.99747716 0.32531085]
[ 0.19189509 0.87105462 0.88158122 0.25056621]]
[[ 0.55541608 0.56859636 0.40616234 0.14683524]
[ 0.09937835 0.63874553 0.92062536 0.32798326]
[ 0.87174236 0.779044 0.79119392 0.06912842]
[ 0.87907434 0.53175367 0.01371655 0.11414196]]
[[ 0.37568516 0.17267374 0.51647046 0.04774661]
[ 0.38573914 0.85335136 0.11647555 0.0758696 ]
[ 0.67559384 0.57535368 0.88579261 0.26278658]
[ 0.13829782 0.28328756 0.51170484 0.04260013]]
Coefficient:
[[ 0.55158868 1.45901817 0.31224322 0.49538173]
[ 0.6995448 0.40804135 0.59938423 0.09084578]
[ 1.79010371 0.21674532 1.60972012 -0.046387 ]
[-0.31562917 -0.53767439 -0.16141312 -0.2154683 ]]
Intercept:
[-0.89705102 -0.50908061 -1.9260686 0.83934127]
predicted:
[[-0.25297601 0.13808785 -0.38696891 0.53426883]
[ 0.63472658 0.18566989 -0.86662193 0.22361739]
[ 0.72181277 0.75309881 0.82170796 0.11715048]
[-0.22656611 0.01383581 -0.79537442 0.55159912]]
R Code
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train <- input_variables_values_training_datasets
y_train <- target_variables_values_training_datasets
x_test <- input_variables_values_test_datasets
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
linear <- lm(y_train ~ ., data = x)
summary(linear)
#Predict Output
predicted= predict(linear,x_test)
2.逻辑回归
不要因为它的姓名而感到困惑,逻辑回归是一个分类算法而不是回归算法。它用于依据给定的一组自变量来估量离散值(二进制值,如0/1,是/否,真/假)。简略来说,它经过将数据拟合到lo git 函数来猜测事情产生的概率。因而,它也被称为logit回归。因为它猜测概率,其输出值在0和1之间(如预期的那样)。
再次,让咱们经过一个简略的比方来检验了解这一点。
假定你的朋友给你一个难题处理。只要2个成果场景 – 你能处理和不能处理。现在幻想,你正在被许多猜谜或许简略检验,来企图了解你拿手的科目。这项研讨的成果将是这样的成果 – 假设给你一个10级的三角形问题,那么你有70%或许会处理这个问题。别的一个比方,假设是五级的前史问题,得到答案的概率只要30%。这便是逻辑回归为你供给的成果。
对数学而言,成果的对数几率被建模为猜测变量的线性组合。
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence ln(odds) = ln(p/(1-p)) logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3….+bkXk
以上,p是感兴趣特征的概率。 它挑选最大化调查样本值的或许性的参数,而不是最小化平方差错的总和(如在一般回归中)。
现在,你或许会问,为什么要选用log? 为了简略起见,让咱们来说,这是仿制阶梯函数的最好的数学办法之一。 我可以进一步具体介绍,但这将会打破这篇文章的目的。
逻辑回归
Python Code
#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create logistic regression object
model = LogisticRegression()
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Equation coefficient and Intercept
print('Coefficient: /n', model.coef_)
print('Intercept: /n', model.intercept_)
#Predict Output
predicted= model.predict(x_test)
R Code
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
logistic <- glm(y_train ~ ., data = x,family='binomial')
summary(logistic)
#Predict Output
predicted= predict(logistic,x_test)
3.决议计划树
这是我最喜爱的算法之一,我常常运用它。 它是一种首要用于分类问题的监督学习算法,令人惊奇的是,它可以适用于分类和连·续因变量。 在该算法中,咱们将集体分为两个或多个均匀调集。 这是依据最重要的特点/自变量来做出的并将它们分为不同的组。关于决议计划树的更多细节,你可以阅览决议计划树简介
决议计划树
在上图中,您可以看到依据多个特点将集体分为四个不同的群组,以确认用户“是否可以玩”。为了 将人口分为不同的特征集体,它运用了比如Gini,信息增益,卡方,熵等各种技能。
JezzBall
了处理议计划树怎么运作的最佳办法是播映Jezzball – 微软 的经典游戏(下图)。 大体上便是,来一同在屏幕上滑动手指,筑起墙面,掩住移动的球吧。
Python Code
#Import Library
#Import other necessary libraries like pandas, numpy…
from sklearn import tree
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create tree object
model = tree.DecisionTreeClassifier(criterion='gini')
# for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini
# model = tree.DecisionTreeRegressor() for regression
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(rpart)
x <- cbind(x_train,y_train)
# grow tree
fit <- rpart(y_train ~ ., data = x,method="class")
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
4.SVM(支撑向量机)
这是一种分类办法。 在这个算法中,咱们将每个数据项目制作为n维 空间 中的一个点(其间n是具有的特征数),每个特征的值是特定坐标的值。
例如,假设咱们有一个人的“高度”和“头发长度”这两个特征,咱们首先将这两个变量制作在二维空间中,其间每个点都有两个坐标(这些坐标称为支撑向量)
支撑向量机
现在,咱们将找到一些可以将数据切割成两类的线。 而咱们想要的线,便是使得两组数据中最近点到切割线的间隔最长的线。
最佳切割 直线
在上述示例中,将数据分红两个不同分类的组的线是黑线,因为两个最接近的点间隔线最远(红线也可以,但不是一最远)。 这条线是咱们的分类器, 然后依据 测验 数据坐落线路两头的方位,咱们可以将新数据分类为什么类别。
Python Code
#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-svm(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
5. 朴素贝叶斯
它是依据贝叶斯定理的分类技能,假定猜测因子之间是独立的。 简略来说,朴素贝叶斯分类器假定类中特定特征的存在与任何其他特征的存在无关。 例如,假假设实是赤色,圆形,直径约3英寸,则果实或许被以为是 苹果 。 即便这些特征依赖于互相或其他特征的存在,一个朴素的贝叶斯分类器将考虑的是一切特点来单独地奉献这个果实是苹果的概率。
朴素贝叶斯模型易于构建,关于十分大的数据集特别有用。 除了简略之外,朴素贝叶斯也被称为超高档分类办法。
贝叶斯定理供给了一种由P(c),P(x)和P(x | c)核算概率P(c | x)的办法。 看下面的等式
朴素贝叶斯
其间:
P(c | x)是在x条件下c产生的概率。
P(c)是c产生的概率。
P(x | c)在c条件下x产生的概率。
P(x)是x产生的概率。
示例:
让咱们用一个比方来了解它。 下面我有一个气候和相应的方针变量“玩游戏”的练习数据集。 现在,咱们需求依据气候条件对玩家是否玩游戏进行分类。 咱们依照以下进程履行。
进程1:将数据集转换为频率表
进程2:经过发现像“Overcast”概率= 0.29和播映概率为0.64的概率来创立似然表。
比方
进程3:现在,运用朴素贝叶斯方程来核算每个类的概率。 其间概率最高的状况便是是猜测的成果。
问题:
假设气候晴朗,玩家会玩游戏,这个说法是正确的吗?
咱们可以运用上述办法处理,所以P(Yes | Sunny) = P( Sunny | Yes) * P(Yes) / P (Sunny)
这儿,P(Sunny | Yes)= 3/9 = 0.33,P(Sunny)= 5/14 = 0.36,P(Yes)= 9/14 = 0.64
现在,P(Yes | Sunny)= 0.33 * 0.64 / 0.36 = 0.60,该事情产生的概率仍是比较高的。
朴素贝叶斯运用类似的办法依据各种特点猜测不同分类的概率,该算法首要用于文本分类和具有多个类的问题。
Python Code
#Import Library
from sklearn.naive_bayes import GaussianNB
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object model = GaussianNB()
# there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-naiveBayes(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
6. KNN (K-近邻算法)
它可以用于分类和回归问题, 可是,它在职业中被广泛地运用于分类问题。 K-近邻算法用于存储一切练习样本集(一切已知的案列),并经过其k个附近数据大都投票对新的数据(或许案列)进行分类。一般,挑选k个最近邻数据中呈现次数最多的分类作为新数据的分类。
这些核算机的间隔函数可以是欧几里德,曼哈顿,闵可夫斯基和汉明间隔。 前三个函数用于接连函数,第四个函数用于分类变量。 假设K = 1,则简略地将该状况分配给其最近邻的类。 有时,挑选K在履行KNN建模时是一个难点。
K-近邻算法
KNN可以轻松映射到咱们的现实生活中。 假设你想了解一个人,你没有任何信息,你或许想知道先去了解他的密切的朋友和他活动的圈子,然后取得他/她的信息!
挑选KNN之前要考虑的事项:
KNN在核算上是贵重的
变量应该被归一化,不然更高的规模变量可以偏移它
在进行KNN之前,预处理阶段的作业更像去除离群值、噪声值
Python Code
#Import Library
from sklearn.neighbors import KNeighborsClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(knn)
x <- cbind(x_train,y_train)
# Fitting model
fit <-knn(y_train ~ ., data = x,k=5)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
7. K-Means
它是处理聚类问题的一种无监督算法。 其进程遵从一种简略而简略的办法,经过必定数量的聚类(假定k个聚类)对给定的数据集进行分类。 集群 内的数据点与对等组是同构的和异构的。
检验从油墨印迹中找出形状?(见下图) k means 与这个活动类似, 你经过墨水渍形状来判别有多少集体存在!
K-Means
下面两点感觉原文解说的不是很清楚,自己然后查了下国内的解说办法
K-means怎么构成集群
(1) 从 n个数据目标恣意挑选 k 个目标作为初始聚类中心;
(2) 依据每个聚类目标的均值(中心目标),核算每个目标与这些中心目标的间隔;并依据最小间隔从头对相应目标进行区分;
(3) 从头核算每个(有改变)聚类的均值(中心目标)
(4) 循环(2)到(3)直到每个聚类不再产生改变停止参阅
比方
K-Means比方
从上图中,咱们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是咱们的种子点,也便是咱们用来找点群的点。有两个种子点,所以K=2。
然后,K-Means的算法如下:
随机在图中取K(这儿K=2)个种子点。
然后对图中的一切点求到这K个种子点的间隔,假设点Pi离种子点Si最近,那么Pi归于Si点群。(上图中,咱们可以看到A,B归于上面的种子点,C,D,E归于下面中部的种子点)
接下来,咱们要移动种子点到归于他的“点群”的中心。(见图上的第三步)
然后重复第2)和第3)步,直到,种子点没有移动(咱们可以看到图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E)。 参阅
K值怎么确认
在实践运用中,因为Kmean一般作为数据预处理,或许用于辅佐分聚类贴标签。所以k一般不会设置很大。可以经过枚举,令k从2到一个固定值如10,在每个k值上重复运转数次kmeans(防止部分最优解),并核算当时k的均匀概括系数,终究选取概括系数最大的值对应的k作为终究的集群数目。参阅
咱们知道跟着群集数量的添加,该值不断削减,可是假设制作成果,则或许会发现平方间隔的总和急剧下降到k的某个值,然后再慢一些。 在这儿,咱们可以找到最佳聚类数。
k值
Python Code
#Import Library
from sklearn.cluster import KMeans
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
# Create KNeighbors classifier object model
k_means = KMeans(n_clusters=3, random_state=0)
# Train the model using the training sets and check score
model.fit(X)
#Predict Output
predicted= model.predict(x_test)
R Code
library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution
8. Random Forest(随机树林)
随机森林(Random Forest)是一个包含多个决议计划树的分类器, 其输出的类别由单个树输出类其他众数而定。(相当于许多不同范畴的专家对数据进行分类判别,然后投票)
随机树林
感觉原文没有将什么本质内容,给咱们推动这一篇 Random Forest入门
9. 降维算法
在曩昔的4-5年中, 数据发掘 在每个或许的阶段都呈指数级增加。 公司/政府机构/研讨机构不只有新的来历,并且他们正在十分具体地发掘数据。
例如: 电子商务 公司正在捕获更多关于客户的细节,例如人口核算,网络爬网前史,他们喜爱或不喜爱的内容,购买前史记录,反应信息等等,给予他们个性化的重视,而不是离你最近的杂货店东。
作为数据科学家,咱们供给的数据还包含许多功用,这对树立杰出的稳健模型是十分有用的,可是有一个应战。 你怎么识别出1000或2000年高度重要的变量? 在这种状况下,维数下降算法可以协助咱们与决议计划树,随机森林,PCA,因子剖析,依据相关矩阵,缺失值比等的其他算法一同运用。
要了解更多有关此算法的信息,您可以阅览 “ Beginners Guide To Learn Dimension Reduction Techniques “.
Python Code
#Import Library
from sklearn import decomposition
#Assumed you have training and test data set as train and test
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
# For Factor analysis
#fa= decomposition.FactorAnalysis()
# Reduced the dimension of training dataset using PCA
train_reduced = pca.fit_transform(train)
#Reduced the dimension of test dataset
test_reduced = pca.transform(test)
For more detail on this, please refer this link.
R Code
library(stats)
pca <- princomp(train, cor = TRUE)
train_reduced <- predict(pca,train)
test_reduced <- predict(pca,test)
10. Gradient Boosting & AdaBoost
当咱们处理很多数据以猜测高猜测才能时,GBM&AdaBoost是愈加强壮的算法。 Boosting是一种归纳学习算法,它结合了几个根本估量器的猜测,以进步单个估量器的鲁棒性。 它将多个弱或均匀猜测值组合到一个强壮的猜测变量上。 这些提高算法在数据科学竞赛中总是可以很好地运转,如Kaggle,AV Hackathon,CrowdAnalytix。
More: Know about Gradient and AdaBoost in detail
Python Code
#Import Library
from sklearn.ensemble import GradientBoostingClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Gradient Boosting Classifier object
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(caret)
x <- cbind(x_train,y_train)
# Fitting model
fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
predicted= predict(fit,x_test,type= "prob")[,2]
结束语
现在我信任,你会有一个常用的机器学习算法的主意。 我在写这篇文章和供给R和Python中的代码的仅有目的便是让你立刻开端。 假设您想要把握机器学习,请将算法运用实践问题,领会其间的趣味