在上图中你可以看到,根据多种属性,人群被分成了不同的四个小组,来判断 "他们会不会去玩"。为了把总体分成不同组别,需要用到许多技术,比如说 Gini、Information Gain、Chi-square、entropy。
理解决策树工作机制的最好方式是玩 Jezzball,一个微软的经典游戏(见下图)。这个游戏的最终目的,是在一个可以移动墙壁的房间里,通过造墙来分割出没有小球的、尽量大的空间。
因此,每一次你用墙壁来分隔房间时,都是在尝试着在同一间房里创建两个不同的总体。相似地,决策树也在把总体尽量分割到不同的组里去。
更多信息请见:决策树算法的简化
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)
这是一种分类方法。在这个算法中,我们将每个数据在 N 维空间中用点标出(N 是你所有的特征总数),每个特征的值是一个坐标的值。
举个例子,如果我们只有身高和头发长度两个特征,我们会在二维空间中标出这两个变量,每个点有两个坐标(这些坐标叫做支持向量)。
现在,我们会找到将两组不同数据分开的一条直线。两个分组中距离最近的两个点到这条线的距离同时最优化。
上面示例中的黑线将数据分类优化成两个小组,两组中距离最近的点(图中 A、B 点)到达黑线的距离满足最优条件。这条直线就是我们的分割线。接下来,测试数据落到直线的哪一边,我们就将它分到哪一类去。
更多请见:支持向量机的简化
将这个算法想作是在一个 N 维空间玩 JezzBall。需要对游戏做一些小变动:
Python 代码
- #Import Library
- from sklearn import svm
- #Assumed you have, X (predic
- tor) 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 英寸,那么这个水果可能会是苹果。即便这些特性互相依赖,或者依赖于别的特性的存在,朴素贝叶斯分类器还是会假设这些特性分别独立地暗示这个水果是个苹果。
朴素贝叶斯模型易于建造,且对于大型数据集非常有用。虽然简单,但是朴素贝叶斯的表现却超越了非常复杂的分类方法。
贝叶斯定理提供了一种从 P(c)、P(x) 和 P(x|c) 计算后验概率 P(c|x) 的方法。请看以下等式:
在这里,
例子:让我们用一个例子来理解这个概念。在下面,我有一个天气的训练集和对应的目标变量 "Play"。现在,我们需要根据天气情况,将会 "玩" 和 "不玩" 的参与者进行分类。让我们执行以下步骤。
步骤 1:把数据集转换成频率表。
步骤 2:利用类似 "当 Overcast 可能性为 0.29 时,玩耍的可能性为 0.64" 这样的概率,创造 Likelihood 表格。
步骤 3:现在,使用朴素贝叶斯等式来计算每一类的后验概率。后验概率最大的类就是预测的结果。
问题:如果天气晴朗,参与者就能玩耍。这个陈述正确吗?
我们可以使用讨论过的方法解决这个问题。于是 P(会玩 | 晴朗)= P(晴朗 | 会玩)* P(会玩)/ P (晴朗)
我们有 P (晴朗 | 会玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(会玩)= 9/14 = 0.64
现在,P(会玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,有更大的概率。
朴素贝叶斯使用了一个相似的方法,通过不同属性来预测不同类别的概率。这个算法通常被用于文本分类,以及涉及到多个类的问题。
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)
该算法可用于分类问题和回归问题。然而,在业界内,K – 最近邻算法更常用于分类问题。K – 最近邻算法是一个简单的算法。它储存所有的案例,通过周围 k 个案例中的大多数情况划分新的案例。根据一个距离函数,新案例会被分配到它的 K 个近邻中最普遍的类别中去。
这些距离函数可以是欧式距离、曼哈顿距离、明式距离或者是汉明距离。前三个距离函数用于连续函数,第四个函数(汉明函数)则被用于分类变量。如果 K=1,新案例就直接被分到离其最近的案例所属的类别中。有时候,使用 KNN 建模时,选择 K 的取值是一个挑战。
更多信息:K – 最近邻算法入门(简化版)
我们可以很容易地在现实生活中应用到 KNN。如果想要了解一个完全陌生的人,你也许想要去找他的好朋友们或者他的圈子来获得他的信息。
在选择使用 KNN 之前,你需要考虑的事情:
- #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)
K – 均值算法是一种非监督式学习算法,它能解决聚类问题。使用 K – 均值算法来将一个数据归入一定数量的集群(假设有 k 个集群)的过程是简单的。一个集群内的数据点是均匀齐次的,并且异于别的集群。
还记得从墨水渍里找出形状的活动吗?K – 均值算法在某方面类似于这个活动。观察形状,并延伸想象来找出到底有多少种集群或者总体。
K – 均值算法怎样形成集群:
如何决定 K 值:
K – 均值算法涉及到集群,每个集群有自己的质心。一个集群内的质心和各数据点之间距离的平方和形成了这个集群的平方值之和。同时,当所有集群的平方值之和加起来的时候,就组成了集群方案的平方值之和。
我们知道,当集群的数量增加时,K 值会持续下降。但是,如果你将结果用图表来表示,你会看到距离的平方总和快速减少。到某个值 k 之后,减少的速度就大大下降了。在此,我们可以找到集群数量的最优值。
- #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
随机森林是表示决策树总体的一个专有名词。在随机森林算法中,我们有一系列的决策树(因此又名 "森林")。为了根据一个新对象的属性将其分类,每一个决策树有一个分类,称之为这个决策树 "投票" 给该分类。这个森林选择获得森林里(在所有树中)获得票数最多的分类。
每棵树是像这样种植养成的:
若想了解这个算法的更多细节,比较决策树以及优化模型参数,我建议你阅读以下文章:
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)
在过去的 4 到 5 年里,在每一个可能的阶段,信息捕捉都呈指数增长。公司、政府机构、研究组织在应对着新资源以外,还捕捉详尽的信息。
举个例子:电子商务公司更详细地捕捉关于顾客的资料:个人信息、网络浏览记录、他们的喜恶、购买记录、反馈以及别的许多信息,比你身边的杂货店售货员更加关注你。
作为一个数据科学家,我们提供的数据包含许多特点。这听起来给建立一个经得起考研的模型提供了很好材料,但有一个挑战:如何从 1000 或者 2000 里分辨出最重要的变量呢?在这种情况下,降维算法和别的一些算法(比如决策树、随机森林、PCA、因子分析)帮助我们根据相关矩阵,缺失的值的比例和别的要素来找出这些重要变量。
想要知道更多关于该算法的信息,可以阅读《降维算法的初学者指南》。
Python 代码
- #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)
当我们要处理很多数据来做一个有高预测能力的预测时,我们会用到 GBM 和 AdaBoost 这两种 boosting 算法。boosting 算法是一种集成学习算法。它结合了建立在多个基础估计值基础上的预测结果,来增进单个估计值的可靠程度。这些 boosting 算法通常在数据科学比赛如 Kaggl、AV Hackathon、CrowdAnalytix 中很有效。
更多:详尽了解 Gradient 和 AdaBoost
- #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)
- 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]
GradientBoostingClassifier 和随机森林是两种不同的 boosting 树分类器。人们常常问起这两个算法之间的区别。
现在我能确定,你对常用的机器学习算法应该有了大致的了解。写这篇文章并提供 Python 和 R 语言代码的唯一目的,就是让你立马开始学习。如果你想要掌握机器学习,那就立刻开始吧。做做练习,理性地认识整个过程,应用这些代码,并感受乐趣吧!
来源: https://yq.aliyun.com/articles/73641