基于sklearn机器学习入门篇总结

什么是机器学习?

机器学习就是从数据中自动分析获得模型,并利用模型对未知数据进行预测。

机器学习算法分类,根据是否有目标值(标签)进行划分。

  • 监督学习
    • 分类问题
    • 回归问题
  • 无监督学习

机器学习开发流程:

用户数据->数据预处理->特征工程->机器学习->模型评估->服务

用户数据

内置数据

sklearn内置许多数据集,可以直接拿来使用。

1
2
3
from sklearn.datasets import load_xxxx
# or
from sklearn.datasets import fetch_xxx

load为内置数据,数据量较小,fetch需要从网络上进行获取,数据量较大。

1
2
from sklearn.datasets import load_iris
from sklearn.datasets import load_boston

数据集划分

获取的数据不应当全部用来进行模型训练,应该保留一部分用来对训练的模型进行测试。

1
2
3
4
5
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

data = load_boston()
x_train,x_test,y_train,y_test = train_test_split(data.data,data.target)

load_boston获取到的数据是包含特征值和目标值的。

将获取到的数据分为训练集和测试集。

  • x_train: 训练集特征值
  • x_test: 测试集特征值
  • y_train: 训练集目标值
  • y_test: 测试机目标值

外部数据处理

对于外部的非数字数据,要将其转换为可供机器学习的数字特征。

字典数据

对字典数据进行特征化提取,转换为one-hot编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sklearn.feature_extraction import DictVectorizer
data = [
{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}
]
# 实例化转换器
transfer = DictVectorizer(sparse=False)
# 转换
data = transfer.fit_transform(data)

"""
data:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
"""

文本数据

对文本内容进行特征提取。

1
2
3
4
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short,i like like python", "life is too long,i dislike python"]
transfer = CountVectorizer()
data = transfer.fit_transform(data)

如果文本内容为中文,则需要对中文内容进行分词处理。(jieba分词)
https://github.com/fxsjy/jieba

TF-IDF文本特征提取。

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
1
2
3
4
from sklearn.feature_extraction.text import TfidfVectorizer

transfer = TfidfVectorizer(stop_words=['的','不会'])
data = transfer.fit_transform(text)

数据预处理

获取到可供机器学习的数据后,需要通过一些转换函数将数据转换为更加适合模型训练的数据。

对于数值型数据进行无量纲化的处理,包括归一化和标准化两种方法。

归一化

归一化是将原始数据进行变换将数据映射到(0,1)之间。

1
2
3
4
from sklearn.preprocessing import MinMaxScaler
# 转换到(2,3)的区间
transfer = MinMaxScaler(feature_range=(2, 3))
data = transfer.fit_transform(data)

归一化容易受异常值点的影响,只适合传统小数据场景。

标准化

标准化通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内,在样本足够多的情况下比较稳定。

1
2
3
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
data = transfer.fit_transform(data)

特征降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。

过滤式

1
2
3
4
5
from sklearn.feature_selection import VarianceThreshold

transfer = VarianceThreshold(threshold=1)
data = transfer.fit_transform(data)
print("删除低方差特征的结果:\n", data)

相关系数

相关系数的值介于–1与+1之间,即–1≤ r ≤+1。

当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系

1
from scipy.stats import pearsonr

对于相关性较大的数据,可以进行处理,比如合成两个指标。

PCA主成分分析

高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量。

1
2
3
4
5
6
7
8
9
from sklearn.decomposition import PCA
"""
PCA(n_components=None)
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
"""
transfer = PCA()
data = transfer.fit_transform(data)

分类算法

KNN算法(K-近邻算法)

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

欧氏距离

A($a_1,a_2,2_3$), B($b_1,b_2,b_3$)

AB之间的距离:$\sqrt {(a_1-b_1)^2+(a_2-b_2)^2+(a_3-b_3)^2}$

1
2
3
4
5
6
7
8
9
10
from sklearn.neighbors import KNeighborsClassifier
"""
KNeighborsClassifier(n_neighbors=5,algorithm='auto')

n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
"""
# 实例化估计器
estimator = KNeighborsClassifier()
# 模型训练
estimator.fit(data.data,data.target)

模型选择调优

以上述算法举例,通过数据对模型进行训练已经能够得到训练后的模型,前文也曾提到,对于使用的数据我们是要划分成训练集和测试集的。那么使用不同的划分结果得出的数据训练出来的模型的准确率也不尽相同。

交叉验证就是划分多次不同的数据集进而对模型进行训练。

超参数搜索-网格搜索(Grid Search)

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.model_selection import GridSearchCV
"""
GridSearchCV(estimator, param_grid=None,cv=None)
"""
# 以KNN算法举例
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(estimator, param_grid=param, cv=2)
gc.fit(data.data,data.target)
# 查看数据
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)

朴素贝叶斯算法

何为朴素?

朴素的意思就是假设各特征之间相互独立。

1
2
3
4
5
6
7
from sklearn.naive_bayes import MultinomialNB
"""
MultinomialNB(alpha = 1.0)
alpha 拉普拉斯平滑系数,防止计算出的分类概率为0
"""
mlb = MultinomialNB(alpha=1.0)
mlb.fit(x_train, y_train)

朴素贝叶斯公式常用于文本分类。

决策树

决策树解决的还是分类问题,也就是研究已有特征值和目标值的关系,根据【特征值区分目标值的能力】构建出一棵树。使得通过较少的判断次数就能够得到分类结果。

1
2
3
4
5
6
7
8
9
from sklearn.tree import DecisionTreeClassifier
"""
DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
max_depth:树的深度大小
random_state:随机数种子
"""
dc = DecisionTreeClassifier(max_depth=5)
dc.fit(x_train, y_train)

导出树的结构文件

1
2
3
4
5
from sklearn.tree import export_graphviz
export_graphviz(dc,
out_file="./tree.dot",
feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

导出的文件配合 http://www.webgraphviz.com
可以查看树的结构。

随机森林

随机森林就是包含多个决策树的分类器,其输出的类别由决策树输出的众树决定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.ensemble import RandomForestClassifier
"""
n_estimators=10 森林中的数目数量
max_depth=None 树的最大深度
"""
rf = RandomForestClassifier()

param = {"n_estimators": [120,200,300,500,800,1200], "max_depth": [5, 8, 15, 25, 30]}

# 超参数调优
gc = GridSearchCV(rf, param_grid=param, cv=2)

gc.fit(x_train, y_train)

print("随机森林预测的准确率为:", gc.score(x_test, y_test))

回归与聚类算法

线性回归

利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

线性回归中的关系:

  • 线性关系
  • 非线性关系

在进行线性回归的时候必然会有所损失,这里就涉及到了两个优化算法。

  • 正规方程

    直接能够得到最好的结果,但是当特征值过于复杂的时候,求解速度太慢并且得不到结果。

  • 梯度下降

    一种试探性求解方式,沿着某个方向慢慢找,适用于训练规模十分庞大的任务。

1
2
3
4
5
6
from sklearn.linear_model import LinearRegression
# 使用正规方程求解
lr = LinearRegression()
# 梯度下降进行预测
sgd = SGDRegressor()
# 各自调用fit方法即可

回归性能评估

1
2
3
from sklearn.metrics import mean_squared_error
# 均方误差
mean_squared_error(y_true, y_pred)

欠拟合和过拟合

  • 欠拟合
    模型过于简单,不能很好的拟合数据。(机器学习到的特征有限)

解决方法:增加特征数量。

  • 过拟合
    模型过于繁杂,机器学习的到的特征过多。

解决方法:(针对回归)正则化、特征选择。

  • L1正则化
  • L2正则化

岭回归

岭回归,其实也是一种线性回归。只不过在算法建立回归方程时候,加上正则化的限制,从而达到解决过拟合的效果

1
2
from sklearn.linear_model import Ridge
# 具有l2正则化的线性回归。

逻辑回归与二分类

逻辑回归 = 线性回归 + sigmoid函数。

线性回归:z = wx+b
sigmoid函数:f = $\frac {1}{(1+e^{-z})}$

损失函数值越小,模型越优。

1
from sklearn.linear_model import LogisticRegression

评估方法:

  • 精确率:预测结果为正例样本中真实为正例的比例
  • 召回率:真实为正例的样本中预测结果为正例的比例

分类评估报告API

1
from sklearn.metrics import classification_report

无监督学习-K-means算法

从无标签(目标值)的数据开始学习。

  • 聚类
    • K-means(K均值聚类)
  • 降维
    • PCA
1
2
3
4
5
from sklearn.cluster import KMeans
"""
KMeans(n_clusters=8,init=‘k-means++’)
n_clusters:开始的聚类中心数量
"""

性能评估-轮廓系数
以一个蓝1点为例

  1. 计算出蓝1离本身族群所有点的距离的平均值$a_i$
  2. 蓝1到其它两个族群的距离计算出平均值红平均,绿平均,取最小的那个距离作为$b_i$
  3. 如果$b_i$ >> $a_i$: 那么公式结果趋近于1;如果$a_i$ >> $b_i$: 那么公式结果趋近于-1

趋近于1,效果好;趋近于-1,效果不好。

1
from sklearn.metrics import silhouette_score

模型保存与加载

1
2
3
4
5
import joblib
# 保存
joblib.dump(estimator, 'test.pkl')
# 加载
estimator = joblib.load('test.pkl')