写在最前:
机器学习中的代码学习相对于理论来说更容易一些,代码只是将数学的公式进行编辑并快速运算。公式全都封装成了API,只要在Python中去调用函数就能实现简单的功能(调包侠哈哈哈)。
sklearn是Python最常用的机器学习包。https://sklearn.apachecn.org/这是中文网站,大家最主要还是根据官方的手册学习。而随着学习门槛越来越低,只有增加对代码背后数学的理解,才能增加自身的竞争力。所有的代码我都会上传到自己的GitHub上。https://github.com/Uncle-Yuanl/Machine-Learning
包的使用
-
训练:包.fit(x_train, y_train)
-
预测:包.predict(y_test)
fit完以后,模型就会带有相应的属性,比如coef_(),intercept_(b)等。就像一个毫无感情的做菜机器人一样,给他菜和调味就能做出顿饭。然而数据的前处理preprocessing(洗菜,择菜的过程)很大程度上决定了最后的学习效果。
LinearRression基本型:
LinearRegression
(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
参数:fit_intercept:布尔值,可选,默认为True
是否计算模型的截距,就是b。
normalize:布尔值,可选,默认为False
当fit_intercept设置为False时,将忽略该参数
如果为True,X会被归一化,。
如果设为False又想要已知数据标准化,使用sklearn.preprocessing.StandardScaler。
关于normalization、standardization、regularization的比较见文末。
copy_X:布尔值,可选,默认为False
如果为True,X被复制;否则可以被覆盖。
n_jobs:整数或者None, 可选,默认为None
决定电脑计算的多进程或多线程
属性:coef_:形状为 (n_features, ) 或者(n_targets, n_features)的数组。
参数。n_features:属性个数;n_targets:目标个数,理解为y的维度。
intercept_:浮点数或者形状为(n_targets,)的数组。
线性模型中的独立项b。
rank:整数。
x的秩,只有x非奇异时能够访问。
singular_:形状为(min(X, y),)的数组
x的奇异值。
>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5, 0.5])
方法:fit(X,y,sample_weight):进行参数估计
sample_weight形状为(n_samples,)的数组,考虑样本自身对于y的权重时设置。
predict(X) : 预测新样本的值
score(X, y[, sample_weight]) :返回决定系数
,越大表示拟合效果越好。
set_params():设置参数
不仅可以在简单模型中使用,也可以结合Pipeline使用,使得可以设置其他函数的参数,如PolynomialFeatures。在上传的代码中有详细讲解。
get_params(deep=True): 获取模型参数。
参数名映射到它们的值。如果为真,将返回此估计器的参数以及包含的作为估计器的子对象。这里的参数并不是和,而是模型本身的信息。通过字典的格式返回,我们可以通过[‘name’]来获得对应的值。
LogisticRegression基本型:
LogisticRegression
(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
哇,一下子多了好多的参数。挑出一些重点的写一下把。
C:浮点数,正则化系数的倒数,越小则正则化强度越大。
solver:求解器, {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},默认‘lbfgs’
官方文档对于求解去给出了详尽的解释。这里只放结果图。
dual:布尔值,默认为False。只有在penalty='l2'且solver=‘liblinear’使用。样本个数>属性个数,倾向于设为False。
tol:浮点数。默认1e-4。两次迭代的差别小于这个数就停止迭代。
max_iter:最大迭代次数。
intercept_scaling:浮点数。solver =‘liblinear’ 且fit_intercept=True时使用。在上一节的多元回归中,这个大矩阵在最后加了一列 全1向量,这个就是将1换成intercept_scaling,则最后的也会相应放缩。
class_weight:字典或者‘balanced’,默认None。类权重。如果是‘balanced’则类出现频率的反比来调整类的权重(改善类别不 平衡)。出现次数多的类则权重小。
l1_ratio:浮点数,默认为None。penalty=‘Elastic-Net’时使用。弹性网Elastic-Net的l1正则化系数。
multi_class:{‘ovr’, ‘multinomial’, ‘auto’}, 默认’auto’。多分类参数,与solver参数有较强联系。详细看文档以及西瓜书。
超参数与模型性能
超参数不是模型学习得到的参数,而是需要人工调整的参数,如l1_ratio。如何确定这些参数,最常用的就是交叉验证。通过给定一个超参数的集合,将每个候选超参数带入模型计算,在根据模型的性能来确定超参数。现在交叉验证直接可以调用LogisticRegressionCV,确定一个cv值就可以。
性能评估最常见就是score值以及roc曲线,相关函数在sklearn的metrics包中。
y = np.array([0, 0, 1, 1])
y_pred = np.array([0.1, 0.5, 0.3, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, y_pred)
fpr = np.insert(fpr, 0, 0)
tpr = np.insert(tpr, 0, 0)
auc = metrics.auc(fpr, tpr)
print(auc)
print(metrics.roc_auc_score(y, y_pred))
plt.plot(fpr, tpr, marker='o', lw=2, ls='-', mfc='g', mec='g', color='r')
plt.show()
鸢尾花数据的roc曲线如下图。
具体示例
还是看具体的代码吧。在使用中会出现的问题都注释了。线性模型确实简单,但还是需要多动手打代码,多分析出来的结果。欢迎大家一起讨论。
参考博客:
normalization、standardization、regularization的比较:
https://blog.csdn.net/castlehe/article/details/88988267
线性多元回归数据检验和代码实现:
https://blog.csdn.net/weixin_40683253/article/details/81109129