机器学习1-回归及聚类

2019-03-27  本文已影响0人  Aptitude

回归问题及聚类

1 线性关系模型

定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合.
一元线性回归:涉及到的变量只有一个;
多元线性回归:涉及到的变量两个或两个以上。
𝑓(𝑥)=𝑤_1 𝑥_1+𝑤_2 𝑥_2+…+𝑤_𝑑 𝑥_𝑑+𝑏
w为权重,b称为偏置项,可以理解为:𝑤_0×1

1.1 损失函数

正规方程

求解:𝑤=(𝑋^𝑇𝑋)^{−1}𝑋^𝑇𝑦
𝑋为特征值矩阵,𝑦为目标值矩阵
缺点:当特征过于复杂,求解速度太慢;对于复杂的算法,不能使用正规方程求解(逻辑回归等)。

梯度下降
梯度下降解释

指定学习率,然后会沿着减小损失函数的方向进行靠近,直到找到损失值的最低点。


二维特征

1.2 波士顿房价预测分析流程

(1) 数据获取
(2)数据分割
(3)训练与测试数据标准化处理
(4)使用简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测。

# 线性回归预测房子价格
def mylinear():
    lb = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
    #特征值和目标值进行标准化处理,实例化两个标准化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    #喂入transform中必须保证是二维数组
    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))
    #estimator预测
###########################正规方程求解方式预测结果################
    lr = LinearRegression()
    lr.fit(x_train,y_train)
    print(lr.coef_)
    #预测测试集的房子价格
    y_predict = std_y.inverse_transform(lr.predict(x_test))
    print("正规方程测试集中的预测价格",y_predict)
#######################梯度下降求解方式预测结果######################
    SGD = SGDRegressor()
    SGD.fit(x_train,y_train)
    print(SGD.coef_)
    #预测测试集的房子价格
    y_sgd_predict = std_y.inverse_transform(SGD.predict(x_test))
    print("SGD测试集中的预测价格",y_sgd_predict)
    return None

1.3 回归性能评估

mean_squared_error(y_true, y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果

print("正规方程的均方误差:",mean_squared_error(y_test,y_predict))
print("SGD的均方误差:", mean_squared_error(y_test, y_sgd_predict))

正规方程与梯度下降的比较:


正规方程与梯度下降(图源黑马程序员)

2. 拟合问题

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

欠拟合与过拟合
线性回归不一定是只拟合出线性方程,对线性模型进行拟合会变成复杂模型。
image.png
欠拟合原因及解决办法:
原因:学习到数据的特征过少;
解决办法:增加数据的特征数量。
过拟合原因及解决办法:
原因: 始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:

特征选择:

2.2 L2正则化

作用:可以使得W的每个元素都很小,都接近于0;
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象。

3. 岭回归

sklearn.linear_model.Ridge(alpha=1.0)

4. 模型的保存与加载

    #保存训练好的模型
    joblib.dump(lr,"test.pkl")
    #预测房价结果
    model = joblib.load("test.pkl")

5. 逻辑回归

逻辑回归解决的是二分类问题的利器。
sigmoid把输入转化为0-1之间的值,可以理解为概率值,默认0.5作为阈值。


image.png

逻辑回归的处理流程如下:


逻辑回归大致思路
损失函数采用的是对数似然损失。在寻找最优解的过程中,对数似然损失会存在局部最低点,而均方误差不存在局部最小值。尽管没有全局最低点,但是效果都是很好。目前这个问题没有很好的解决方案,以下方式只能尽量改善:

良/恶性乳腺癌肿分类流程:

(1)获取数据;
(2)数据缺失值处理、标准化;
(3)LogisticRegression估计器流程。

#逻辑回归做二分类进行癌症预测,根据细胞的属性特征
def logistic():
    #构造列标签名字
    column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
    #读取数据
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",names=column)
    #print(data)
    #缺失值进行处理
    data = data.replace(to_replace='?',value=np.nan)
    data = data.dropna()
    #数据分割
    x_train,x_test,y_train,y_test = train_test_split(data[column[1:10]],data[column[10]])
    #标准化处理
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)
    #逻辑回归预测
    lg = LogisticRegression(C=1.0)
    lg.fit(x_train,y_train)
    print(lg.coef_)
    y_predict = lg.predict(x_test)
    print("准确率",lg.score(x_test,y_test))
    print("召回率",classification_report(y_test,y_predict,labels = [2,4],target_names=['良性','恶性']))
    return None
运行结果
应用:广告点击率预测、电商购物搭配推荐;
优点:适合需要得到一个分类概率的场景;
缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)。

朴素贝叶斯与逻辑回归对比,如图:


对比

6. K-means

6.1 步骤

(1)随机设置K个特征空间内的点作为初始的聚类中心;
(2)对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类
中心点作为标记类别;
(3)接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
均值);
(4)如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行
第二步过程。

6.2 性能评估指标

轮廓系数:
计算公式:𝑠𝑐_𝑖= (𝑏_𝑖−𝑎_𝑖)/(max⁡(𝑏_𝑖,𝑎_𝑖))
注:对于每个点𝑖 为已聚类数据中的样本 ,𝑏𝑖 为𝑖 到其它族群的所有样本的平均
距离,𝑎
𝑖 为𝑖 到本身簇的距离平均值.
最终计算出所有的样本点的轮廓系数平均值。

上一篇下一篇

猜你喜欢

热点阅读