07逻辑回归、非监督学习

混江龙づ霸主 提交于 2020-01-11 16:30:54

一.逻辑回归

解决二分类问题的利器,算法自动分为0和1,比如设广告被点击为1,不被点击为0。

sigmoid函数:

 

1.公式

 

 

 

输出:[0,1]区间的概率值,默认0.5作为阀值

注:g(z)为sigmoid函数

2. 对数似然损失函数

 

 

 

1)       cost损失的值越小,那么预测的类别准确度更高

2)       出现的问题:多个局部最⼩小值,目前解决不了

l  梯度下降求解

1)       多次随机初始化,多次⽐比较最⼩小值结果

2)       求解过程当中,调整学习率 尽量量改善。尽管没有全局最低点,但是效果都是不不错的

3.API   sklearn.linear_model.LogisticRegression

  • sklearn.linear_model.LogisticRegression(penalty=‘l2’,C = 1.0)
    • Logistic回归分类器
    • coef_:回归系数

在实际使用时,对于目标值来说,哪⼀一个类别少,判定概率值是指的这个类别,即1为属于目标值所属类别较少的类别。

4.优缺点

1)       应用:广告点击率预测、电商购物搭配推荐

2)       优点:适合需要得到一个分类概率的场景

3)       缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)

5.实例代码

def logistic():

    """

    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)

    :return: NOne

    """

    # 构造列标签名字

    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]], test_size=0.25)

 

    # 进行标准化处理

    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

 

二.非监督学习

1.定义

非监督学习是指所给数据集没有给出目标值,所以需要自己不断地去探索出数据集对应目标值地个数及它们是什么。

2.主要方法:K-means

1)       随机设置K个特征空间内的点作为初始的聚类中心

2)       对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别

3)       接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)

4)       如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

3.API :  sklearn.cluster.KMeans

  • sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
    • k-means聚类
    • n_clusters:开始的聚类中心数量
    • init:初始化方法,默认为'k-means ++’
    • labels_:默认标记的类型,可以和真实值比较(不是值比较)

4.性能评估

轮廓系数:

       计算公式:

注:对于每个点为已聚类数据中的样本 , 为 到其它族群的所有样本的平均距离,为 到本身簇的距离平均值。最终计算出所有的样本点的轮廓系数平均值。

l        如果 小于0,说明 的平均距离大于最近的其他簇。聚类效果不好

l        如果 越大,说明 的平均距离小于最近的其他簇。聚类效果好

l  轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优

平时训练算法时达到0.7左右就算比较成功了

5.性能评估API:sklearn.metrics.silhouette_score

  • sklearn.metrics.silhouette_score(Xlabels)
    • 计算所有样本的平均轮廓系数
    • X:特征值
    • labels:被聚类标记的目标值

6.总结

特点分析:

       采用迭代式算法,直观易懂并且非常实用

缺点:容易收敛到局部最优解(多次聚类)

      需要预先设定簇的数量(k-means++解决)

7.实例

部分代码:

km=KMeans(n_clusters=4)

km.fit(x)//前面提取好的数据集

pridect = km.precdict(x)

silhouette_score(x,precdict)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!