Machine Learning无疑是最近两年最热门的话题之一。在Google Trend中可以非常直观地观察到机器学习受到越来越多关注。
今天,小X为大家梳理一下常用的机器学习的算法,希望让各位Xcourse的小伙伴对机器学习有更多的了解。具体的代码和案例也会在后面提供给大家。
机器学习
之
八大常用算法
1. Linear Regression 线性回归
2. Logistic Regression 逻辑回归
3. Decision Trees 决策树
4. Support Vector Machines 支持向量机
5. K-Nearest Neighbors k最邻近分类算法
6. Random Forests 随机森林算法
7. K-Means Clustering k-平均算法
8. Principal Components Analysis 主成分分析
这篇文章基于python 3.5.2,我们先引入一些基本的package:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline
文中的数据集(dataset)主要来自于UC Irvine大学的machine learning repository,具体链接见文章末尾。
DO NOT PANIC,我们要开始Machine Learning漫游了!
1
Linear Regression
线性回归大家都很熟悉了,但很多人在考虑machine learning的算法时,常常忽略了它,原因就是linear regression太简单。但是简单的,不代表不实用。
Simpler is always preferred over complex when performance is comparable.
线性回归是监督学习的一种,它基于已有的特征去预估结果。可以用单个特征做预测(simple linear regression),也可以做多个特征(multiple linear regression) ,可以把它理解为在不同的特征间赋予最佳的权重,用一条线来拟合数据。
好了,理论就不详细介绍了,这里就直接给大家上代码。
数据导入
from sklearn import linear_model
df = pd.read_csv(‘linear_regression_df.csv’)
df.columns = [‘X’, ‘Y’]
df.head()
数据可视化
sns.set_context(“notebook”, font_scale=1.1)
sns.set_style(“ticks”)
sns.lmplot(‘X’,’Y’, data=df)
plt.ylabel(‘Response’)
plt.xlabel(‘Explanatory’)
模型搭建
linear = linear_model.LinearRegression()
trainX = np.asarray(df.X[20:len(df.X)]).reshape(-1, 1)
trainY = np.asarray(df.Y[20:len(df.Y)]).reshape(-1, 1)
testX = np.asarray(df.X[:20]).reshape(-1, 1)
testY = np.asarray(df.Y[:20]).reshape(-1, 1)
linear.fit(trainX, trainY)
linear.score(trainX, trainY)
print(‘Coefficient: \n’, linear.coef_)
print(‘Intercept: \n’, linear.intercept_)
print(‘R² Value: \n’, linear.score(trainX, trainY))
predicted = linear.predict(testX)
2
Logistic Regression
逻辑回归也是监督学习的一种,主要用来做非连续性数据的概率预测,所以给出的结果是0到1之间的概率,是一个非常强大的分类器。因此在实际应用中,当我们能够拿到许多低层次的特征时,可以考虑使用逻辑回归来解决我们的问题。它也是很多其他机器学习算法的构建基础。
话不多说,请看代码:
数据导入
from sklearn.linear_model import LogisticRegression
df = pd.read_csv(‘logistic_regression_df.csv’)
df.columns = [‘X’, ‘Y’]
df.head()
数据可视化
sns.set_context(“notebook”, font_scale=1.1)
sns.set_style(“ticks”)
sns.regplot(‘X’,’Y’, data=df, logistic=True)
plt.ylabel(‘Probability’)
plt.xlabel(‘Explanatory’)
模型实现
logistic = LogisticRegression()
X = (np.asarray(df.X)).reshape(-1, 1)
Y = (np.asarray(df.Y)).ravel()
logistic.fit(X, Y)
logistic.score(X, Y)
print(‘Coefficient: \n’, logistic.coef_)
print(‘Intercept: \n’, logistic.intercept_)
print(‘R² Value: \n’, logistic.score(X, Y))
3
Decision Trees
决策树模型常被用来做分类(classification)和回归(regression)。决策树是一个预测模型,它表示对象属性和对象值之间的一种映射,树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象。树的叶子节点表示对象所属的预测结果。
上面就是一个简单的决策树。
数据导入
from sklearn import tree
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X1’, ‘X2’, ‘X3’, ‘X4’, ‘Y’]
df.head()
数据可视化
模型构建
from sklearn.cross_validation import train_test_split
decision = tree.DecisionTreeClassifier(criterion=’gini’)
X = df.values[:, 0:4]
Y = df.values[:, 4]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
decision.fit(trainX, trainY)
print(‘Accuracy: \n’, decision.score(testX, testY))
4
Support Vector Machines (SVM)
SVM是监督学习中常用的分类模型。可以把它理解成,在分散的点集中,画一条线,让每个集合中最近的点相互之间离得最远。
具体的数学原理这里就不多做介绍了。请看下面的代码。
数据导入
from sklearn import svm
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X4’, ‘X3’, ‘X1’, ‘X2’, ‘Y’]
df = df.drop([‘X4’, ‘X3’], 1)
df.head()
模型构建
from sklearn.cross_validation import train_test_split
support = svm.SVC()
X = df.values[:, 0:2]
Y = df.values[:, 2]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
support.fit(trainX, trainY)
print(‘Accuracy: \n’, support.score(testX, testY))
pred = support.predict(testX)
模型可视化
sns.set_context(“notebook”, font_scale=1.1)
sns.set_style(“ticks”)
sns.lmplot(‘X1’,’X2', scatter=True, fit_reg=False, data=df, hue=’Y’)
plt.ylabel(‘X2’)
plt.xlabel(‘X1’)
5
KNN
K-nearest neighbour 顾名思义就是找合适的中心点,然后把离这个中心点最近的点集合在一起。所以KNN常被用在数据分类中。
小X带大家来看下引自维基百科上的一幅图:
如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。
如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
KNN是不是很简单?我们看看如何代码实现吧。
数据导入
from sklearn.neighbors import KNeighborsClassifier
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X1’, ‘X2’, ‘X3’, ‘X4’, ‘Y’]
df = df.drop([‘X4’, ‘X3’], 1)
df.head()
数据可视化
sns.set_context(“notebook”, font_scale=1.1)
sns.set_style(“ticks”)
sns.lmplot(‘X1’,’X2', scatter=True, fit_reg=False, data=df, hue=’Y’)
plt.ylabel(‘X2’)
plt.xlabel(‘X1’)
模型构建
from sklearn.cross_validation import train_test_split
neighbors = KNeighborsClassifier(n_neighbors=5)
X = df.values[:, 0:2]
Y = df.values[:, 2]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
neighbors.fit(trainX, trainY)
print(‘Accuracy: \n’, neighbors.score(testX, testY))
pred = neighbors.predict(testX)
6
Random Forests
Forest顾名思义就是很多树tree组成的,random是随机的意思。那么random forest算法就是通过不同的随机树,然后归总。
比如上图有三个tree,第一和第三的结果是粉红,第二是绿色,最后归总的预测结果就是粉红。
数据导入
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X1’, ‘X2’, ‘X3’, ‘X4’, ‘Y’]
df.head()
模型构建
from sklearn.cross_validation import train_test_split
forest = RandomForestClassifier()
X = df.values[:, 0:4]
Y = df.values[:, 4]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
forest.fit(trainX, trainY)
print(‘Accuracy: \n’, forest.score(testX, testY))
pred = forest.predict(testX)
7
K-Means Clustering
K-Means是非监督学习中常用的分类算法,K指的是分类的类别数目。
上图就是K means算法的简单原理。好了,代码来了。
数据导入
from sklearn.cluster import KMeans
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X1’, ‘X2’, ‘X3’, ‘X4’, ‘Y’]
df = df.drop([‘X4’, ‘X3’], 1)
df.head()
模型实现
from sklearn.cross_validation import train_test_split
kmeans = KMeans(n_clusters=3)
X = df.values[:, 0:2]
kmeans.fit(X)
df[‘Pred’] = kmeans.predict(X)
df.head()
模型可视化
sns.set_context(“notebook”, font_scale=1.1)
sns.set_style(“ticks”)
sns.lmplot(‘X1’,’X2', scatter=True, fit_reg=False, data=df, hue = ‘Pred’)
8
Principal Components Analysis
主成分分析(PCA)常被用来做数据预处理,在尽量保持原有数据的信息前提下,降低数据的维度。
可以看看下面这张图:
有三个不同维度的特征,然后通过PCA处理后,我们可以在保持原来数据信息的情况下,用两个特征去代表原来的三个维度的数据
数据导入
from sklearn import decomposition
df = pd.read_csv(‘iris_df.csv’)
df.columns = [‘X1’, ‘X2’, ‘X3’, ‘X4’, ‘Y’]
df.head()
模型实现
from sklearn import decomposition
pca = decomposition.PCA()
fa = decomposition.FactorAnalysis()
X = df.values[:, 0:4]
Y = df.values[:, 4]
train, test = train_test_split(X,test_size = 0.3)
train_reduced = pca.fit_transform(train)
test_reduced = pca.transform(test)
pca.n_components_
小X今天的分享就到这里啦!
喜欢小X的分享,记得关注哦 ^ ^
对数据分析感兴趣的童鞋,
可以扫描下列二维码加入数据分析群,
一起嗨起来!
附录:
本文数据集
https://archive.ics.uci.edu/ml/datasets/Diabetes
https://archive.ics.uci.edu/ml/datasets/Iris
xCOURSE∣干货分享 求职辅导
关注并回复“拉我入群”,大神带你玩转数据分析
领取专属 10元无门槛券
私享最新 技术干货