本文旨在为那些获取关于重要机器学习概念知识的人们提供一些机器学习算法,并且附上相关算法的程序实现。
通用的机器学习算法包括:
1.决策树。
2.SVM。
3.朴素贝叶斯。
4.KNN。
5.K均值。
6.随机森林。
下面是使用Python和R代码实现并简要解释这些常见机器学习算法。
1.决策树:
这是作者最喜欢的算法之一,作者经常使用它。它是一种主要用于分类问题的监督学习算法。令人惊讶的是,它竟然适用于分类和连续因变量。在这个算法中,我们可以将人口分成两个或更多的齐次集合。这需要基于一些非常重要的属性和独立变量完成的,以使组群尽可能独立。
Python代码:
#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代码:
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)
2.支持向量机(SVM)
这是一种分类方法。在这个算法中,我们将每个数据项绘制为一个n维空间中的一个点(其中n是你拥有的特征的数量),每个特征的值是特定坐标的值。
例如,如果我们只有两个特征,比如一个人的身高和头发长度,我们首先将这两个变量绘制在二维空间中,每个点有两个坐标值表示(称为支持向量)。接着,我们将找到一些将两个不同分类的数据组之间的数据分割的行,这将是两组中最近点之间距离最远的线。
Python代码:
#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代码:
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)
3.朴素贝叶斯:
这是一种基于贝叶斯定理的分类技术,假设预测变量之间具有独立性。简而言之,朴素贝叶斯分类器假设类中特定特征的存在与任何其他特征的存在无关。例如,如果果实呈红色,圆形,直径约3英寸,则果实可以被认为是苹果。即使这些特征依赖于彼此或者依赖于其他特征的存在,朴素贝叶斯分类器也会考虑所有这些特性来独立地预测该水果是苹果的可能性。
朴素贝叶斯模型很容易构建,对于非常大的数据集特别有用。朴素贝叶斯是众所周知的,高度复杂的分类方法。
贝叶斯定理提供了一种计算P(c),P(x)和P(x|c)的后验概率的方法:P(c|x)。
· P(c|x)是给定预测器(属性)的类(目标)的后验概率。
· P(c)是类的先验概率。
· P(x|c)是预测器给定类的概率的可能性。
· P(x)是预测器的先验概率。
Python代码:
#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代码:
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)
4.KNN(最近邻居):
这个算法可以用于分类和回归问题。但在ML行业中分类问题更为广泛。K近邻是一种简单的算法,它存储所有可用的案例,并通过其K个邻居的多数投票来分类新案例。KNN算法的核心是如果一个样本在特征空间中的K个最相邻样本值得大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。其中判断的依据是距离函数的计算。
这些距离函数可以是欧几里得,曼哈顿,闵可夫斯基或汉明距离。前三个函数用于连续函数,Hamming用于分类变量。如果K = 1,那么这个情况就被简单地分配给它最近的邻居的类别。有时候,在执行KNN建模时选择K是一个巨大的挑战。
KNN可以很容易地映射到我们的真实生活中。如果你想了解一个你不了解的人,你可能会想知道他们的密友和他们进入的圈子,以获得他们的信息!
选择KNN之前需要考虑的事项是:
KNN在计算资源上是昂贵的。
变量应该被标准化,否则较高范围的变量可能会偏差。
在进行KNN之前更多地处理预处理阶段,如异常值/噪音消除。
Python代码:
#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代码:
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)
5.K均值:
这是一种解决聚类问题的无监督算法,其过程遵循一个简单的方法,即通过一定数量的聚类来分类给定的数据集(假设K个聚类)。群集内的数据点与同级群组是同质且异质的。
还记得从墨迹中弄出形状吗?K-means有点类似于这个活动。你可以通过看形状破译有多少不同的群集/人口存在!
K-means如何形成一个集群:
K-均值为每个群集选取K个点数,称为质心。
每个数据点形成具有最接近质心的群集,即K个群集。
根据现有集群成员查找每个集群的质心。
由于我们有新的质心,请重复步骤2和步骤3.从新质心找到每个数据点的最近距离,并与新的K个聚类关联。重复这个过程直到收敛,即质心不变。
如何确定K的价值:
在K-means中,我们有簇,每个簇都有自己的质心。集群内质心和数据点之差的平方和构成该集群平方值的总和。另外,当所有群集的平方和的总和被加上时,它成为群集解决方案的平方和的总和。
我们知道,随着簇数量的增加,这个值会不断下降,但是如果你绘制结果的话,你可能会看到,平方距离的总和急剧下降到某个K值,然后慢得多。这样,我们就可以找到最佳的簇数。
Python代码:
#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代码:
library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution
6.随机森林:
随机森林是一个决策树集合的术语。在随机森林里,我们有一系列被称为森林的决策树。为了根据属性对新的对象进行分类,每棵树都给出了一个分类,并且我们说这棵树对那个分类“投票”,森林选择票数最多的分类(在森林中的所有树上)。
每棵树种植和生长如下:
如果训练集中的病例数为N,则随机抽取N个病例样本,并进行替换。
如果有M个输入变量,则指定一个数m << M,使得从M中随机选择每个m变量,并且使用m上的最佳划分来分割节点。在森林生长期间,m的值保持不变。
每棵树都尽可能地生长。没有修剪。
Python代码:
#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model= RandomForestClassifier()
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R代码:
library(randomForest)
x <- cbind(x_train,y_train)
# Fitting model
fit <- randomForest(Species ~ ., x,ntree=500)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)