Python机器学习漫游指南

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∣干货分享 求职辅导

关注并回复“拉我入群”,大神带你玩转数据分析

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G16XEO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券