Target
概念、直觉、工具,技术
- Scikit-learn
实现许多有效ML学习算法 - TensorFlow 使用数据流图进行分布式数值计算的库,高效训练和运行神经网络,2015年开源
简单技术(随机森林等)==》深度学习(复杂问题:图像识别、语音识别、NLP)
1 机器学习概览
为什么使用ML?(垃圾邮件过滤 传统vs.ML) ML优势:
- 需要大量手工任务或需要长串规则解决的问题:ML算法可以简化代码、提高性能
- 问题复杂、传统方法难以解决
- 环境波动:ML算法可以适应新数据
数据挖掘:使用ML挖掘大量数据,可以发现不显著的规律
ML类型
- 监督/非监督学习
- 在线学习/批量学习
- 基于实例学习/基于模型学习
监督学习:用来训练算法的训练数据包含标签 重要监督学习算法:
- K近邻算法
- 线性回归
- 逻辑回归
- 支持向量机(SVM)
- 决策树和随机森林
- 神经网络
非监督学习:训练数据不含标签 重要非监督学习算法:
- 聚类
- 可视化和降维
- 关联性规则学习
半监督学习:大量不带标签数据加小部分带标签数据,多数半监督学习算法是非监督+监督
强化学习:学习系统智能体(agent),对环境观察,选择执行动作,获得奖励,自己学习哪个策略最佳,得以获得长久最大奖励。
离线(批量)学习 vs 在线学习 离线学习:必须用所有可用数据训练,一般是线下做,通常会占用大量时间和计算资源 在线学习:使用数据实例持续进行训练,可以每次一个或几个实例,适合接受连续流数据。
基于实例学习:先用记忆学习案例,再使用相似度测量推广到新例子 基于模型学习:分析数据,选择模型,用训练数据训练,使用新模型对案例预测
挑战:
1 训练数据量不足
2 低质量数据
3 不相关特征(特征工程:特征选择、特征提取)
4 过拟合
5 欠拟合
理解训练集、验证集、测试集的作用: 一般是80%数据用作训练集、20%数据用作测试集;用训练集和多个超参数训练多个模型,用验证集选择性能最好的模型和超参数,用测试集做最后一次test。
2 一个完整的机器学习项目
关键步骤:
- 1 项目概述
- 2 获取数据
- 3 可视化数据,发现规律
- 4 为算法准备数据
- 5 选择模型,训练
- 6 微调模型
- 7 给出解决方案
- 8 部署、监控、维护
项目概览
利用加州普查数据学习,然后根据指标,预测任何街区的房价中位数
- 划定问题 商业目标是模型输出,传递给另一个ML系统,确定某个区值不值得投资 当前的解决方案效果如何:当前是专家手工,费钱费时间,效果不理想
设计系统:监督or非监督,or强化学习,分类or回归,批量or线上学习? ans:监督学习,典型的回归任务,多变量回归
- 选择性能指标 典型指标是均方根误差RMSE、MAE
准备数据
- 数据清洗
大部分算法不能处理缺失的特征,需要用函数处理特征缺失问题 举例:total_bedrooms有一些缺失值,对应3个解决选项:- 去掉对应街区
- 去掉属性total_bedrooms
- 赋值(0、平均值、中位数等)
housing.dropna(subset=["total_bedrooms"]) # 选项1
housing.drop("total_bedrooms", axis=1) # 选项2
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median) # 选项3
- 处理文本和类别属性
大多数算法处理数字,需要文本标签转换为数字 使用独热编码(One-Hot Encoding),Scikit-Learn OneHotEncoder,用于将整数分类值转变为独热向量(因为只有一个属性会等于 1(热),其余会是 0(冷))
>>> from sklearn.preprocessing import OneHotEncoder
>>> encoder = OneHotEncoder()
>>> housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
>>> housing_cat_1hot
<16513x5 sparse matrix of type '<class 'numpy.float64'>'
with 16513 stored elements in Compressed Sparse Row format>
-
自定义转换器 为了让自制的转换器与 Scikit-Learn 组件(比如流水线)无缝衔接工作, 创建一个类并执行三个方法:fit()(返回self),transform(),和fit_transform()
-
特征缩放 两种常见方法:归一化(normalization)和标准化
-
转换流水线 Scikit-Learn 提供了类Pipeline
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
num_pipeline = Pipeline([
('imputer', Imputer(strategy="median")),
('attribs_adder', CombinedAttributesAdder()),
('std_scaler', StandardScaler()),
])
housing_num_tr = num_pipeline.fit_transform(housing_num)
选择、训练模型
简单的线性回归模型
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)
复杂点的决策树模型
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor()
tree_reg.fit(housing_prepared, housing_labels)
使用交叉验证评估: Scikit-Learn 的交叉验证功能,K 折交叉验证(K-fold cross-validation) 随机地将训练集分成十个不同的子集,成为“折”,然后训练评估决策树模型 10 次,每次选一个不用的折来做评估,用其它 9 个来做训练。结果是一个包含 10 个评分的数组:
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)
模型微调
前提:你现在有了一个列表,列表里有几个有希望的模型,现在需要对列表中模型微调。
-
网格搜索 Scikit-Learn的GridSearchCV试验超参
-
随机搜索 RandomizedSearchCV
-
集成方法
把表现最好的模型组合起来
分析最佳模型和它们的误差
通过分析最佳模型,可以发现每个属性对于做出准确预测的相对重要性, 可以丢弃一些不那么重要的特征. 还可以看一下系统犯的误差,搞清为什么会有些误差,以及如何改正问题(添加更多的特征,或相反,去掉没有什么信息的特征,清洗异常值等等).
用测试集合评估系统
从测试集得到预测值和标签,运行full_pipeline转换数据, 再用测试集评估最终模型
评估结果通常要比交叉验证的效果差一点.