机器学习的理解与学习

机器学习与传统统计学的区别与联系

个人理解:

  • 机器学习中用到了很多统计学中的知识,很多算法就是基于统计学的方法。但是机器学习的重点是要突出“学习”二字,传统统计学中不涉及“学习”这个概念,给定数据之后,模型通过一些指标计算就可以得出了,而机器学习的方式更像是一种“努力减少错误”的学习。比如线性回归的最小二乘法,统计学直接可以根据样本算出斜率和截距得到模型。而机器学习是直接初始就给定参数,然后通过努力去减少误差,并将误差最小(或低于阈值)时的参数,当作是模型的参数。
  • 此外,统计学的重点是将样本描述的准确,而机器学习一开始就将数据分为了训练集和测试集,这表明统计学重点刻画已知样本的内在关系与规律,机器学习更侧重于对未知样本的预测与刻画。所以机器学习中的算法越高端,预测的准确度越高,但是可解释性越弱,中间层涉及的越多。
  • 对于一般的应用,如果想证明两个变量相关,就要采用统计学的方法,而如果要进行预测,则采用机器学习。

机器学习案例流程(参考《sklearn与tensorflow机器学习实用指南》)

  1. 明确项目目的(如预测任何街区的房价中位数)
    划定问题,明确商业目标是什么,建立的模型会被如何使用,根据时间和金钱限制,选择合适的模型和微调时间等。

  2. 选择性能指标
    得到的模型是否良好,要选择一个性能指标来评估,评估的依据是训练的模型与实际结果的差异有多大,常用的指标是均方根误差(RMSE)
    在这里插入图片描述
    但是如果数据中的异常值太多,则推荐使用平均绝对误差(MAE)
    在这里插入图片描述
    二者分别是K 阶闵氏范数的2阶和1阶的表达形式,一般来说范数的指数越高,就越关注大的值而忽略小的值。这就是为什么 RMSE 比 MAE 对异常值更敏感。但是当异常值是指数分布的(类似正态曲线),RMSE 就会表现很好。

  3. 核实假设
    列出自己和他人作出的所有假设,提早发现严重问题,避免“审题错误”,最后做的模型和结果不符合要求。

  4. 数据收集,并快速查看数据结构
    数据收集是项目中最花费时间和金钱的环节,一般不涉及。

#查看数据简单描述
import pandas as pd
data=pd.read_csv("路径\data.csv") #读取csv类型数据
data.head()                       #显示数据前五行
data.info                         #数据行数、数据每个属性的类型、非空值数量
data.describe()					  #数值性概括如均值中位数等括							

#查看数据分布
%matplotlib inline   # only in a Jupyter notebook
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
plt.show()
  1. 创建测试集
  • 随机分割法:(数据集很大)
from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)
  • 分层采样:(数据集较小)
from sklearn.model_selection import StratifiedShuffleSplit

split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)

for train_index, test_index in split.split(data, data["分层的属性"]):
    strat_train_set = data.loc[train_index]
    strat_test_set = data.loc[test_index]
  1. 数据探索和可视化、发现规律
    测试集放一边,只研究训练集。

  2. 数据清洗(每一个步骤都要做函数封装好,便于重复利用)
    根据模型对数据的要求,对数据进行处理。常见要处理的目标有:
    缺失值处理、异常值或离群值处理、类别转换、特征缩放、特征提取等。

  3. 建模

  4. 交叉验证(将训练集分为几份,一份当验证集,其余当测试集,滚动验证,性能指标是效用函数(越大越好)

from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg, housing_prepared, housing_labels,
                         scoring="neg_mean_squared_error", cv=10)
rmse_scores = np.sqrt(-scores)
  1. 确定最佳超参数
  • 网格搜索
from sklearn.model_selection import GridSearchCV
#设定候选参数,依据模型内可选的参数
param_grid = [
    {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
    {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
  ]
#实例化模型
forest_reg = RandomForestRegressor()
#网格搜索实例化
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
                           scoring='neg_mean_squared_error')
#网格搜索估计
grid_search.fit(housing_prepared, housing_labels)
>>> grid_search.best_params_
{'max_features': 6, 'n_estimators': 30}

  • 随机搜索
    但是当超参数的搜索空间很大时,最好使用 RandomizedSearchCV
    这个类的使用方法和类 GridSearchCV 很相似,但它不是尝试所有可能的组合,而是随机测试规定次数的组合。比如两个参数,各有10个候选值,网格搜索会搜索全部组合100个,而随机搜索可以限定只搜索10个组合,可以节省时间,尽快提供参考数据。
  1. 集成方法
    另一种微调系统的方法是将表现最好的模型组合起来。组合(集成)之后的性能通常要比单独的模型要好(就像随机森林要比单独的决策树要好),特别是当单独模型的误差类型不同时。
  • 投票分类
    通过使用不同的训练算法去得到一些不同的分类器。
from sklearn.ensemble import RandomForestClassifier 
from sklearn.linear_model import LogisticRegression 
from sklearn.svm import SVC

from sklearn.ensemble import VotingClassifier 
#实例化
log_clf = LogisticRegression() 
rnd_clf = RandomForestClassifier() 
svm_clf = SVC()
#实例化
voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf),('svc', svm_clf)],voting='hard') 
#如果所有的分类器都能够预测类别的概率(例如他们有一个 predict_proba() 方法),那么你就可以让 sklearn 以最高的类概率来预测这个类,平均在所有的分类器上。这种方式叫做软投票。他经常比硬投票表现的更好,因为它给予高自信的投票更大的权重。
#把 voting="hard" 设置为 voting="soft" 来保证分类器可以预测类别概率。然而这不是 SVC 类的分类器默认的选项,所以你需要把它的 probability hyperparameter 设置为 True (这会使 SVC 使用交叉验证去预测类别概率,其降低了训练速度,但会添加 predict_proba() 方法)。
voting_clf.fit(X_train, y_train)
  • Bagging (有放回,通常首选)和 Pasting(无放回)
    对每一个分类器都使用相同的训练算法,但是在不同的训练集上去训练它们。每一个单独的分类器在如果在原始训练集上都是高偏差,但是聚合降低了偏差和方差。通常情况下,集成的结果是有一个相似的偏差,但是对比与在原始训练集上的单一分类器来讲有更小的方差。
    分类器可以通过不同的 CPU 核或其他的服务器一起被训练。相似的,分类器也可以一起被制作。这就是为什么 Bagging 和 Pasting 是如此流行的原因之一:它们的可扩展性很好。
from sklearn.ensemble import BaggingClassifier 
from sklearn.tree import DecisionTreeClassifier
#这是 Bagging 的例子,如果你想尝试 Pasting,就设置 bootstrap=False
#n_jobs 参数告诉 sklearn 用于训练和预测所需要 CPU 核的数量。(-1 代表着 sklearn 会使用所有空闲核
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,        max_samples=100, bootstrap=True, n_jobs=-1) 
bag_clf.fit(X_train, y_train) 
y_pred = bag_clf.predict(X_test)
#如果基分类器可以预测类别概率(例如它拥有 predict_proba() 方法),那么 BaggingClassifier 会自动的运行软投票,这是决策树分类器的情况。
  • 提升(Boosting,最初称为假设增强)
    指的是可以将几个弱学习者组合成强学习者的集成方法。最著名的两个提升方法是:Adaboost(适应性提升,是 Adaptive Boosting 的简称) 和 Gradient Boosting(梯度提升)
    Adaboost的思想是是对之前分类结果不对的训练实例多加关注,使其权重提升。一个重要的缺点就是:它不能被并行化(只能按步骤),因为每个分类器只能在之前的分类器已经被训练和评价后再进行训练。因此,它不像Bagging和Pasting一样。
from sklearn.ensemble import AdaBoostClassifier  #AdaBoostRegressor
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5) 
ada_clf.fit(X_train, y_train)

Gradient Boosting它并不像 Adaboost 那样每一次迭代都更改实例的权重,它使用新的分类器去拟合前面分类器预测的残差 。将这些分类器加起来就可以更好的进行预测。

from sklearn.ensemble import GradientBoostingRegressor
gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0) 
gbrt.fit(X, y)
  • Stacking(stacked generalization 的缩写)
    不在使用某些具体方法来给出聚合的预测值,如硬投票,而是直接通过函数来聚合预测值。
    聚合函数的训练集是基分类器的预测值。
    使用方法参考
 
iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
 
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB 
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
import numpy as np
 
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3], 
                          meta_classifier=lr)
————————————————
版权声明:本文为CSDN博主「will_duan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/willduan1/article/details/73618677
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值