Scikit-Learn 机器学习的知识结构[编辑中]
先认识个网站UCI: http://archive.ics.uci.edu/ml/ ,它就是:Machine Learning Repository
image1. 监督学习 - Supervised learning (最重要)
特征:有标签 - Labeled data 、直接反馈 - Direct feedback 、预测未来结果 -Predict Outcome/future
分类 - Classification
识别某个对象属于哪个类别
(这个答案是离散的,比如某机场是否有降雨)
应用:垃圾邮件检测、图像识别
算法:SVM、nearest neighbors、random forest
回归 - Regression
预测与对象相关联的连续值属性
(这个答案是连续的,比如某机场的能见度)
应用:药物反应、股价
代价函数:
1. 线性回归 与 最小二乘法(平方误差函数)
LinearRegression 适合一个带有系数 的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小。
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
print(reg.coef_)
print(reg.predict([[3,3]]))
2. 岭 (脊) 回归 与 RidgeCV
Ridge Regression通过对系数的大小施加惩罚来解决 普通最小二乘法 (普通最小二乘)的一些问题。 岭系数最小化一个带罚项的残差平方和
#岭回归
from sklearn import linear_model
reg = linear_model.Ridge(alpha = .5)
reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print(reg.coef_)
print(reg.intercept_)
print(reg.predict([[3,3]]))
# 设置正则化参数:广义交叉验证
reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print(reg.alpha_) # 0.1
reg.fit([[0, 0], [1, 1], [2, 2]], [0, .1, 2])
print(reg.alpha_) # 1.0
3. Lasso 与 LassoCV and LassoLarsCV
The Lasso 是估计稀疏系数的线性模型。 它在一些情况下是有用的,因为它倾向于使用具有较少参数值的情况,有效地减少给定解决方案所依赖变量的数量。 因此,Lasso及其变体是 压缩感知领域 的基础。 在一定条件下,它可以恢复一组非零权重的精确集
def lasso():
reg = linear_model.Lasso(alpha=0.1)
reg.fit([[0, 0, 0], [1, 1, 1]], [0, 1])
print(reg.predict([[1, 1, 1]]))
def train_lassolars_model(train_x, train_y, predict_x):
print_title("LassoLars Regressor")
reg = linear_model.LassoLarsCV(cv=10, n_jobs=3, max_iter=2000, normalize=False)
reg.fit(train_x, train_y)
print("alphas and cv_alphas: {0} and {1}".format(
reg.alphas_.shape, reg.cv_alphas_.shape))
print("alphas[%d]: %s" % (len(reg.cv_alphas_), reg.cv_alphas_))
print("mse shape: {0}".format(reg.cv_mse_path_.shape))
# print("mse: %s" % np.mean(_mse, axis=0))
# print("mse: %s" % np.mean(_mse, axis=1))
# index = np.where(reg.alphas_ == reg.alpha_)
# print("itemindex: %s" % index)
index = np.where(reg.cv_alphas_ == reg.alpha_)
_mse_v = np.mean(reg.cv_mse_path_[index, :])
print("mse value: %f" % _mse_v)
print("best alpha: %f" % reg.alpha_)
best_alpha = reg.alpha_
reg = linear_model.LassoLars(alpha=best_alpha)
reg.fit(train_x, train_y)
n_nonzeros = (reg.coef_ != 0).sum()
print("Non-zeros coef: %d" % n_nonzeros)
predict_y = reg.predict(predict_x)
print({'y': predict_y, "coef": reg.coef_})
4. Logistic Regression - 对数几率回归(逻辑回归)
是离散选择法模型之一,属于多重变量分析范畴,是社会学、生物统计学、临床研究、数量心理学、计量经济学、市场营销、统计实证分析的常用方法。
主要有三个类:LogisticRegression, LogisticRegressionCV 和logistic_regression_path
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(train_feature,label)
predict['label'] = clf.predict(predict_feature)
默认参数如下:
class sklearn.linear_model.LogisticRegression(
penalty='l2',
dual=False,
tol=0.0001,
C=1.0,
fit_intercept=True,
intercept_scaling=1,
class_weight=None,
random_state=None,
solver='liblinear',
max_iter=100,
multi_class='ovr',
verbose=0,
warm_start=False,
n_jobs=1)
-
penalty 惩罚项(str,有‘L1’、’L2’可选)
L1:向量中各元素绝对值的和。作用是产生少量的特征,而其他的特征都是0,常用于特征选择;
L2:向量中各个元素平方之和再开根号。作用是选择较多的特征,使他们都趋近于0; -
C值(float,default=1.0)
目标函数的约束条件:s.t.||w||1<C
由此可看出 C值越小,则正则化强度越大。 -
class_weight(dict or ‘balanced’, optional)
由于逻辑回归的学习方法有很多种:“liblinear”、“lbfgs”、 “newton-cg”、“sag”、“saga”
5. SGD (Stochastic gradient descent) - 随机梯度下降
随机梯度下降是拟合线性模型的一个简单而高效的方法。在样本量(和特征数)很大时尤为有用。 方法 partial_fit 可用于 online learning (在线学习)或基于 out-of-core learning (外存的学习)
SGDClassifier 和 SGDRegressor 分别用于拟合分类问题和回归问题的线性模型,可使用不同的(凸)损失函数,支持不同的罚项。 例如,设定 loss="log" ,则 SGDClassifier 拟合一个逻辑斯蒂回归模型,而 loss="hinge" 拟合线性支持向量机(SVM).
SGD是一种简单但又非常高效的方法,主要用于凸损失函数下线性分类器的判别式学习,例如(线性) 支持向量机 和 Logistic 回归 。 尽管 SGD 在机器学习社区已经存在了很长时间, 但是最近在 large-scale learning (大规模学习)方面 SGD 获得了相当大的关注。
SGD 已成功应用于在文本分类和自然语言处理中经常遇到的大规模和稀疏的机器学习问题。对于稀疏数据,本模块的分类器可以轻易的处理超过 10^5 的训练样本和超过 10^5 的特征。
SGD 的优势:
- 高效。
- 易于实现 (有大量优化代码的机会)。
SGD 的劣势:
- SGD 需要一些超参数,例如 regularization (正则化)参数和 number of iterations (迭代次数)。
- SGD 对 feature scaling (特征缩放)敏感。
6. KRR (Kernel ridge regression) - 内核岭回归
使用 l2 正则化的最小二乘法
由 KernelRidge 学习的模型的形式与支持向量回归( SVR ) 是一样的。但是他们使用不同的损失函数:内核岭回归(KRR)使用 squared error loss (平方误差损失函数)而 support vector regression (支持向量回归)(SVR)使用 -insensitive loss ( ε-不敏感损失 ),两者都使用 l2 regularization (l2 正则化)。与 SVR 相反,拟合 KernelRidge 可以以 closed-form (封闭形式)完成,对于中型数据集通常更快。另一方面,学习的模型是非稀疏的,因此比 SVR 慢, 在预测时间,SVR 学习了:math:epsilon > 0 的稀疏模型。
7. SVM (Support Vector Machine) - 支持向量机
是在 分类 与 回归分析 中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器
SVMs 可用于以下监督学习算法分类、回归和异常检测。SVM的优势在于:
- 在高维空间中非常高效。
- 即使在数据维度比样本数量大的情况下仍然有效。
- 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的。
- 通用性:不同的核函数 核函数 与特定的决策函数一一对应。
SVM的缺点包括:
- 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化项是非常重要的。
- 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的。
半监督学习中的标签传播算法
2. 无监督学习 - Unsupervised learning
特征:无标签、无反馈、寻找隐藏的结构 - Find hidden structure
聚类 - Clustering
将相似对象自动分组
应用:客户细分、分组实验结果
算法:k-Means, spectral clustering, mean-shift,
降维 - Dimensionality reduction
减少要考虑的随机变量的数量
应用:可视化、提高效率
算法:PCA, feature selection, non-negative, matrix factorization
3. 强化学习 - Reinforcement
特征:决策流程、激励系统、学习一系列的行动
马尔可夫决策过程
动态规划
除了监督学习,和无监督学习中的聚类与降维算法都有非常多的教程。此外,在模型选择中,文档教程描述了交叉验证的使用、估计器超参数的调整、模型评估方法和模型持久化概念等。
数据预处理是机器学习非常重要的部分,我们可以使用归一化等方法大大降低前向传播与学习算法的计算复杂度,也可以利用缺失值插补和特征提取等方法增加数据的有效性。
分类
SVC、NuSVC 和 LinearSVC 能在数据集中实现多元分类:
imageSVC 和 NuSVC 是相似的方法,但是接受稍许不同的参数设置并且有不同的数学方程。另一方面,LinearSVC 是另一个实现线性核函数的支持向量分类。记住 LinearSVC 不接受关键词 kernel,因为它被假设为线性的。它也缺少一些 SVC 和 NuSVC 的成员(members)比如 support_。
和其他分类器一样,SVC、NuSVC 和 LinearSVC 将两个数组作为输入:[n_samples, n_features] 大小的数组 X 作为训练样本,[n_samples] 大小的数组 y 作为类别标签 (字符串或者整数):
在拟合后, 这个模型可以用来预测新的值:
SVMs 决策函数取决于训练集的一些子集, 称作支持向量. 这些支持向量的部分特性可以在 support_vectors_、support_和 n_support 找到: