精华内容
下载资源
问答
  • # 为逻辑回归添加多项式项的管道 def PolynomialLogisticRegression(degree): return Pipeline([ ('poly', PolynomialFeatures(degree=degree)), ('std_scaler', StandardScaler()), ('log_reg', Logistic...
  • 机器学习 逻辑回归算法应用案例 时间:2020.09.12 出处:https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1 注明:初学逻辑回归,跟着博客大佬文章过了一遍,自己留个记录以便之后翻阅,也供大家学习。...

    机器学习 逻辑回归算法应用案例

    时间:2020.09.12
    出处:https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1
    注明:初学逻辑回归,跟着博客大佬文章过了一遍,自己留个记录以便之后翻阅,也供大家学习。。

    1、数据

    本次数据为Kaggle著名的公开数据集坦泰尼克号之灾。
    数据源地址:https://www.kaggle.com/c/titanic
    如果你是第一次进入kaggle,你需要注册一个账号才能下载数据集,进入该链接之后请按下图找数据。
    在这里插入图片描述

    在这里插入图片描述
    下载数据即可,前提是你处于登录状态,如果你没有Kaggle账号,你可以通过Kaggle创捷一个账号,毕竟这么强的网站不创建个账号都亏了太多了_,但是这个账号创建好像是得用VPN,不然无法进行人机验证(我是这样的)。
    如果你真的没有账号也不想注册,你可以去原作者的github瞅瞅:https://github.com/HanXiaoyang/Kaggle_Titanic

    2、数据分析处理

    现在先来看看数据长什么样

    import pandas as pd #数据分析
    import numpy as np #科学计算
    from pandas import Series,DataFrame
    data_train = pd.read_csv("D:/material/titanic/train.csv")
    data_train
    

    Out:
    在这里插入图片描述
    这就是典型的dataframe格式,我们看到,总共有12列,其中Survived字段表示的是该乘客是否获救,其余都是乘客的个人信息,包括:

    PassengerId => 乘客ID
    Pclass => 乘客等级(1/2/3等舱位)
    Name => 乘客姓名
    Sex => 性别
    Age => 年龄
    SibSp => 堂兄弟/妹个数
    Parch => 父母与小孩个数
    Ticket => 船票信息
    Fare => 票价
    Cabin => 客舱
    Embarked => 登船港口

    之后,我们让dataframe自己告诉我们一些信息,如下所示:

    data_train.info()
    

    Out:
    在这里插入图片描述
    从结果中可以看出训练数据中总共有891名乘客,但是很不幸,我们有些属性的数据不全,比如说:
    Age(年龄)属性只有714名乘客有记录
    Cabin(客舱)更是只有204名乘客是已知的
    我们用下列的方法,得到数值型数据的一些分布(因为有些属性,比如姓名,是文本型;而另外一些属性,比如登船港口,是类目型。这些我们用下面的函数是看不到的):

    data_train.describe()
    

    Out:
    在这里插入图片描述
    我们从上面看到更进一步的什么信息呢? mean字段告诉我们,大概0.383838的人最后获救了,2/3等舱的人数比1等舱要多,平均乘客年龄大概是29.7岁(计算这个时候会略掉无记录的)等等…

    在大概了解数据信息之后我们开始对这些数据进行更深入的了解,通过可视化数据来更加清晰的分析数据。
    代码如下:

    #数据可视化分析
    %matplotlib inline 
    import matplotlib.pyplot as plt
    
    #指定默认字体
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    plt.rcParams['font.family']='sans-serif'
    #解决负号'-'显示为方块的问题
    plt.rcParams['axes.unicode_minus'] = False 
    
    
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图
    data_train.Survived.value_counts().plot(kind='bar')# 柱状图 
    plt.title(u"获救情况 (1为获救)") # 标题
    plt.ylabel(u"人数")  
    
    plt.subplot2grid((2,3),(0,1))
    data_train.Pclass.value_counts().plot(kind="bar")
    plt.ylabel(u"人数")
    plt.title(u"乘客等级分布")
    
    plt.subplot2grid((2,3),(0,2))
    plt.scatter(data_train.Survived, data_train.Age)
    plt.ylabel(u"年龄")                         # 设定纵坐标名称
    plt.grid(b=True, which='major', axis='y') 
    plt.title(u"按年龄看获救分布 (1为获救)")
    
    
    plt.subplot2grid((2,3),(1,0), colspan=2)
    data_train.Age[data_train.Pclass == 1].plot(kind='kde')   
    data_train.Age[data_train.Pclass == 2].plot(kind='kde')
    data_train.Age[data_train.Pclass == 3].plot(kind='kde')
    plt.xlabel(u"年龄")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"各等级的乘客年龄分布")
    plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph.
    
    
    plt.subplot2grid((2,3),(1,2))
    data_train.Embarked.value_counts().plot(kind='bar')
    plt.title(u"各登船口岸上船人数")
    plt.ylabel(u"人数")  
    plt.show()
    

    Out:
    在这里插入图片描述
    我们在图上可以看出来,被救的人300多点,不到半数;3等舱乘客非常多;遇难和获救的人年龄似乎跨度都很广;3个不同的舱年龄总体趋势似乎也一致,2/3等舱乘客20岁多点的人最多,1等舱40岁左右的最多;登船港口人数按照S、C、Q递减,而且S远多于另外俩港口。
    通过这些数据我们可以看出来一些信息了,心里也会有一定的思考,放上原作者的想法:
    1)不同舱位/乘客等级可能和财富/地位有关系,最后获救概率可能会不一样
    2)年龄对获救概率也一定是有影响的,毕竟前面说了,副船长还说『小孩和女士先走』呢
    3)和登船港口是不是有关系呢?也许登船港口不同,人的出身地位不同?
    口说无凭,空想无益。老老实实再来统计统计,看看这些属性值的统计分布吧。

    接下来先看看乘客获救与乘客等级Pclass的关系
    代码如下:

    #看看各乘客等级的获救情况
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
    Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
    df=pd.DataFrame({u'未获救':Survived_0,u'获救':Survived_1})
    df.plot(kind='bar', stacked=True)
    plt.title(u"各乘客等级的获救情况")
    plt.xlabel(u"乘客等级") 
    plt.ylabel(u"人数") 
    plt.show()
    

    Out:
    在这里插入图片描述
    再来看看乘客获救情况与性别Sex的关系
    代码如下:

    #看看各性别的获救情况
    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
    Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
    print(Survived_m)#这里我将这些数据输出,以便于我的理解
    print(Survived_f)
    df=pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
    df.plot(kind='bar', stacked=True)
    plt.title(u"按性别看获救情况")
    plt.xlabel(u"获救") 
    plt.ylabel(u"人数")
    plt.show()
    

    Out:
    在这里插入图片描述
    然后我们再来看看各种舱级别情况下各性别的获救情况
    代码如下:

    #然后我们再来看看各种舱级别情况下各性别的获救情况
    fig=plt.figure()
    fig.set(alpha=0.65) # 设置图像透明度,无所谓
    plt.title(u"根据舱等级和性别的获救情况")
    
    ax1=fig.add_subplot(141)
    data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().sort_index().plot(kind='bar', label="female highclass", color='#FA2479')
    ax1.set_xticks([0,1])
    print(ax1)
    ax1.set_xticklabels([u"未获救", u"获救"], rotation=0)
    ax1.legend([u"女性/高级舱"], loc='best')
    
    ax2=fig.add_subplot(142, sharey=ax1)
    data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().sort_index().plot(kind='bar', label='female, low class', color='pink')
    ax2.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"女性/低级舱"], loc='best')
    
    ax3=fig.add_subplot(143, sharey=ax1)
    data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().sort_index().plot(kind='bar', label='male, high class',color='lightblue')
    ax3.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"男性/高级舱"], loc='best')
    
    ax4=fig.add_subplot(144, sharey=ax1)
    data_train.Survived[data_train.Sex == 'male'][data_train.Pclass == 3].value_counts().sort_index().plot(kind='bar', label='male low class', color='steelblue')
    ax4.set_xticklabels([u"未获救", u"获救"], rotation=0)
    plt.legend([u"男性/低级舱"], loc='best')
    
    plt.show()
    

    Out:
    在这里插入图片描述
    再看看各登船港口的获救情况
    代码如下:

    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
    Survived_1 = data_train.Embarked[data_train.Survived == 1].value_counts()
    df=pd.DataFrame({u'未获救':Survived_0,u'获救':Survived_1})
    df.plot(kind='bar', stacked=True)
    plt.title(u"各登船港口乘客的获救情况")
    plt.xlabel(u"登船港口") 
    plt.ylabel(u"人数") 
    
    plt.show()
    

    Out:
    在这里插入图片描述
    看看 堂兄弟/妹,孩子/父母有几人,对是否获救的影响
    代码如下:

    #看看 堂兄弟/妹,孩子/父母有几人,对是否获救的影响
    gg = data_train.groupby(['SibSp','Survived'])
    df = pd.DataFrame(gg.count()['PassengerId'])
    print(df)
    
    gp = data_train.groupby(['Parch','Survived'])
    df = pd.DataFrame(gp.count()['PassengerId'])
    print(df)
    

    Out:
    在这里插入图片描述
    tickets cabin的分析
    ticket是船票编号,应该是unique的,和最后的结果没有太大的关系,先不纳入考虑的特征范畴
    cabin只有204个乘客有值,我们先看看它的一个分布

    data_train.Cabin.value_counts()
    

    Out:
    在这里插入图片描述
    关键是Cabin这鬼属性,应该算作类目型的,本来缺失值就多,还如此不集中,注定是个棘手货…第一感觉,这玩意儿如果直接按照类目特征处理的话,太散了,估计每个因子化后的特征都拿不到什么权重。加上有那么多缺失值,要不我们先把Cabin缺失与否作为条件(虽然这部分信息缺失可能并非未登记,maybe只是丢失了而已,所以这样做未必妥当),先在有无Cabin信息这个粗粒度上看看Survived的情况好了。
    代码如下:

    fig = plt.figure()
    fig.set(alpha=0.2)  # 设定图表颜色alpha参数
    
    Survived_cabin = data_train.Survived[pd.notnull(data_train.Cabin)].value_counts()
    Survived_nocabin = data_train.Survived[pd.isnull(data_train.Cabin)].value_counts()
    df=pd.DataFrame({u'有':Survived_cabin, u'无':Survived_nocabin}).transpose()
    df.plot(kind='bar', stacked=True)
    plt.title(u"按Cabin有无看获救情况")
    plt.xlabel(u"Cabin有无") 
    plt.ylabel(u"人数")
    plt.show()
    

    Out:
    在这里插入图片描述
    看了这么多数据的可视化关联分析,下面我们开始进入数据预处理,为逻辑回归建模做准备。。

    3、数据预处理

    这里还是直接放作者原话,毕竟讲得好:
    先从最突出的数据属性开始吧,对,Cabin和Age,有丢失数据实在是对下一步工作影响太大。

    先说Cabin,暂时我们就按照刚才说的,按Cabin有无数据,将这个属性处理成Yes和No两种类型吧。

    再说Age:通常遇到缺值的情况,我们会有几种常见的处理方式

    如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了 如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中 如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。 有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。 本例中,后两种处理方式应该都是可行的,我们先试试拟合补全吧(虽然说没有特别多的背景可供我们拟合,这不一定是一个多么好的选择)

    我们这里用scikit-learn中的RandomForest来拟合一下缺失的年龄数据(注:RandomForest是一个用在原始数据中做不同采样,建立多颗DecisionTree,再进行average等等来降低过拟合现象,提高结果的机器学习算法)
    代码如下:

    from sklearn.ensemble import RandomForestRegressor
    
    ### 使用 RandomForestClassifier 填补缺失的年龄属性
    def set_missing_ages(df):
    
        # 把已有的数值型特征取出来丢进Random Forest Regressor中
        age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    
        # 乘客分成已知年龄和未知年龄两部分
        known_age = age_df[age_df.Age.notnull()].values
        unknown_age = age_df[age_df.Age.isnull()].values
    
        # y即目标年龄
        y = known_age[:, 0]
    
        # X即特征属性值
        X = known_age[:, 1:]
    
        # fit到RandomForestRegressor之中
        rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
        rfr.fit(X, y)
    
        # 用得到的模型进行未知年龄结果预测
        predictedAges = rfr.predict(unknown_age[:, 1::])
    
        # 用得到的预测结果填补原缺失数据
        df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges 
    
        return df, rfr
    
    def set_Cabin_type(df):
        df.loc[ (df.Cabin.notnull()), 'Cabin' ] = "Yes"
        df.loc[ (df.Cabin.isnull()), 'Cabin' ] = "No"
        return df
    
    data_train, rfr = set_missing_ages(data_train)
    data_train = set_Cabin_type(data_train)
    

    之后输出一波数据来看看

    data_train.head(10)
    

    Out:
    在这里插入图片描述
    因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征因子化。 什么叫做因子化呢?举个例子:

    以Cabin为例,原本一个属性维度,因为其取值可以是[‘yes’,’no’],而将其平展开为’Cabin_yes’,’Cabin_no’两个属性

    原本Cabin取值为yes的,在此处的”Cabin_yes”下取值为1,在”Cabin_no”下取值为0 原本Cabin取值为no的,在此处的”Cabin_yes”下取值为0,在”Cabin_no”下取值为1 我们使用pandas的”get_dummies”来完成这个工作,并拼接在原来的”data_train”之上,如下所示。

    #将类目型特征因子化,通过pandas的”get_dummies”来完成这个工作
    dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix= 'Cabin')
    
    dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')
    
    dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex')
    
    dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')
    
    df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
    df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
    df.head()
    

    Out:
    在这里插入图片描述
    我们还得做一些处理,仔细看看Age和Fare两个属性,乘客的数值幅度变化,也忒大了吧!!如果大家了解逻辑回归与梯度下降的话,会知道,各属性值之间scale差距太大,将对收敛速度造成几万点伤害值!甚至不收敛! (╬▔皿▔)…所以我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。

    #我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。
    import sklearn.preprocessing as preprocessing
    scaler = preprocessing.StandardScaler()
    age_scale_param = scaler.fit(df['Age'].values.reshape(-1,1))
    df['Age_scaled'] = scaler.fit_transform(df['Age'].values.reshape(-1,1), age_scale_param)
    fare_scale_param = scaler.fit(df['Fare'].values.reshape(-1,1))
    df['Fare_scaled'] = scaler.fit_transform(df['Fare'].values.reshape(-1,1), fare_scale_param)
    df.head()
    

    Out:
    在这里插入图片描述
    现在基本上就把训练数据处理好了,可以开始进行建模了。

    4、逻辑回归建模

    我们把需要的feature字段取出来,转成numpy格式,使用scikit-learn中的LogisticRegression建模。
    代码如下:

    from sklearn import linear_model
    
    # 用正则取出我们要的属性值
    train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    train_np = train_df.values
    
    # y即第0列:Survival结果
    y = train_np[:, 0]
    
    # X即第1列及以后:特征属性值
    X = train_np[:, 1:]
    
    # fit到LogisticRegression之中
    clf = linear_model.LogisticRegression(solver='liblinear',C=1.0, penalty='l1', tol=1e-6)
    clf.fit(X, y)
    
    clf
    

    Out:
    在这里插入图片描述
    就这样,一个逻辑回归模型已经训练出来了,可以看出来机器学习的关键还是在于对数据的分析与处理上(初学机器学习,仅个人观点),但是现在还不能对test数据进行预测,我们需要对test数据做相同格式的处理,也简单了,直接按照上面的来就行了。
    代码如下:

    #现在将test文件做同样的变化
    data_test = pd.read_csv("D:/material/titanic/test.csv")
    data_test.loc[ (data_test.Fare.isnull()), 'Fare' ] = 0
    # 接着我们对test_data做和train_data中一致的特征变换
    # 首先用同样的RandomForestRegressor模型填上丢失的年龄
    tmp_df = data_test[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    null_age = tmp_df[data_test.Age.isnull()].values
    # 根据特征属性X预测年龄并补上
    X = null_age[:, 1:]
    predictedAges = rfr.predict(X)
    data_test.loc[ (data_test.Age.isnull()), 'Age' ] = predictedAges
    
    data_test = set_Cabin_type(data_test)
    dummies_Cabin = pd.get_dummies(data_test['Cabin'], prefix= 'Cabin')
    dummies_Embarked = pd.get_dummies(data_test['Embarked'], prefix= 'Embarked')
    dummies_Sex = pd.get_dummies(data_test['Sex'], prefix= 'Sex')
    dummies_Pclass = pd.get_dummies(data_test['Pclass'], prefix= 'Pclass')
    
    
    df_test = pd.concat([data_test, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
    df_test.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
    df_test['Age_scaled'] = scaler.fit_transform(df_test['Age'].values.reshape(-1,1), age_scale_param)
    df_test['Fare_scaled'] = scaler.fit_transform(df_test['Fare'].values.reshape(-1,1), fare_scale_param)
    df_test.head()
    

    Out:
    在这里插入图片描述
    下面就可以进行数据预测了
    代码如下:

    test = df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    predictions = clf.predict(test)
    result = pd.DataFrame({'PassengerId':data_test['PassengerId'].values, 'Survived':predictions.astype(np.int32)})
    result.head()
    

    Out:
    在这里插入图片描述

    5、总结

    这样的话就完成了一个最基本的逻辑回归算法应用,按照原作者的话,这只是万里长征的第一步…
    原作者后面还有一些逻辑回归系统的优化,用来提高它的准确率,这里我就不做记录了,如果读者有需要可以直接去原作博客:https://blog.csdn.net/han_xiaoyang/article/details/49797143
    后面写的也真的很好的,很建议去学习学习。
    这是我的第一篇博客呢,虽然大部分都是复制粘贴的,但也算是学习着写了一篇博客,之后会努力写更多文章,给自己留笔记,也给大家分享知识,挺好。

    展开全文
  • 虽然逻辑回归算法的名字中有回归二字,但是它却不是回归算法,它其实是分类算法。它通常是利用已知的自变量来预测一个离散型因变量的值。简单来说,它就是通过拟合一个逻辑函数来预测一个事件发生的概率。所以它预测...

    https://www.toutiao.com/a6630407688360575502/

     

    2018-12-04 22:46:48

    逻辑回归算法

    虽然逻辑回归算法的名字中有回归二字,但是它却不是回归算法,它其实是分类算法。它通常是利用已知的自变量来预测一个离散型因变量的值。简单来说,它就是通过拟合一个逻辑函数来预测一个事件发生的概率。所以它预测的是一个概率值,自然它的输出值应该在0到1之间。要想实现输出值的范围在0到1,我们可以使用一个简单的函数来做到,这个函数就是sigmoid函数。

    sigmoid函数

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    sigmoid函数图像

    sigmoid函数如上图所示,我们可以看出它的值域在0~1之间。逻辑回归算法和Sigmod函数结合起来可以实现逻辑回归分类器,我们可以在每一个样本特征上都乘以一个回归系数,然后将所有的结果值相加,将总和代入Sigmoid函数,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分为y=1类,小于0.5被归为y=0类。

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    逻辑回归分类器

    以上就是逻辑回归分类器的计算过程,我们来分析一下这个计算过程,我们输入样本x,然后样本特征xi乘以一个回归系数θj,我们将所有的结果进行相加,其实就是θ的转置*X,然后我们再将求和结果带入sigmoid函数中,最终的结果就是hθ(x)。如果hθ(x)大于0.5,那么这个样本我们就认为y=1,如果如果hθ(x)小于0.5,那么这个样本我们就认为y=0,这就是逻辑回归分类器的核心思想。

    使用逻辑回归分类器完成癌症良性和恶性的判别

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    癌症病人样本

    现在我们有一个如上所示的癌症病人的样本数据,其中O表示良性,而X表示恶性,现在我们的任务是通过逻辑回归分类算法学习出一条决策边界,从而将这两个样本给分开,当我们拥有这条决策边界之后,以后当再有新的样本的时候,我们就可以直接代入我们的模型中,就可以得出这个病人是良性还是恶性了。具体来说我们需要学习出如下所示的决策边界:

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    逻辑回归分类器的决策边界

    我们可以看到这条蓝色的决策边界完成分开了两种不同的样本,我们的目的就是训练出这样的一条分类边界那么以后我们的模型就可以判断病人是否患有恶性肿瘤了,要想训练出这样的分类边界,我们可以使用逻辑回归的梯度下降算法

    逻辑回归的梯度下降算法

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    分类边界方程

    我们设我们的分类边界的方程如上所示,我们将这个分类边界带入到sigmoid函数中,我们就可以得出逻辑回归分类器的模型表示。

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    逻辑回归分类器的模型

    当我们带入样本特征x1、x2的时候,如果hθ(x)的结果大于0.5,那么我们可以认为这个样本类别为y=1,如果hθ(x)的结果小于0.5,那么我们可以认为这个样本的类别为y=0。

    现在模型已经有了,现在的问题是模型中存在未知的参数θ0、θ1和θ2,所以我们现在的任务是通过已知数据,从而训练出最好的参数θ,要想完成这个任务,我们需要使用梯度下降算法。

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    梯度下降算法

    经过梯度下将算法之后,我们可以得出适合已经训练数据的最佳参数θ,假设最好的参数θ0=-3、θ1=1、θ2=1,那么此时我们的逻辑回归分类器的莫模型方程就是

    基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    逻辑回归分类器的模型

    有了这个模型之后,我们就可以带入未知的样本特征x1和x2,从而得出未知病人样本是否是恶性肿瘤,具体来说如果带入之后如果hθ(x)>0.5就是恶性,而hθ(x)<0.5就是良性,这就是逻辑回归算法在分类中的应用。

    展开全文
  • 逻辑回归算法用于估计预测目标的可能性,它属于软分类算法,即最终得到的是一个具体的概率,而不仅仅是“是”或“不是”这样的二分类结果;逻辑回归能提供一个样本属于正类的可能性是多少,比如假设对于样本x,回归...

    1. 算法原理

    logistic/sigmoid函数作用:把取值范围从负无穷到正无穷的公式计算结果,压缩到0和1之间,这样的输出值表达为“可能性”更直观。

    逻辑回归算法用于估计预测目标的可能性,它属于软分类算法,即最终得到的是一个具体的概率,而不仅仅是“是”或“不是”这样的二分类结果;

    逻辑回归能提供一个样本属于正类的可能性是多少,比如假设对于样本x,回归系数w,(w^T是向量w的转置),使用sigmoid函数可以获得这个样本属于正类的概率为:

     

    本次实验标签是二分类模型的(1或者0),所以当我们预测得到概率h(x)时这样判断结果:如果样本x属于正类的概率大于0.5,那么就判定它是正类,否则就是负类。

    这条公式很简洁,唯一的未知的变量就是参数w,我们需要通过用训练集来训练求解得到最优w,用这个最优w代入上述公式中即可对测试集样本进行预测。先初始化一个w向量(比如设置其所有元素为1),然后不断迭代找到最优的w,那么要怎么判断一个w是最优的呢?这就又要用到最大似然,或者说是代价函数了。

    构建逻辑回归模型f(θ),最典型的构建方法便是应用最大似然估计。似然函数公式:

     

    当标签y=1时p=h(x),是x样本属于标签1的概率;当标签y=0时p=1-h(x),是x样本属于标签0的概率,因此p必是x样本属于y标签的概率,或者说p代表了准确度。在这个基础上,推导出代价函数:

     

    先解释一下这个公式,当标签y=1时,此时的代价可表示为:

     

    如果判定的h(x)=1,即预测正确,则代价cost=0,h(x)越小,代价越大,如果判定的h(x)=0,即预测错误,则代价cost趋于无穷大。

    同理当标签y=0时,cost可表示为:

     

    如果判定h(x)=0,即预测正确则代价cost=0,h(x)越大,代价越大,如果判定h(x)=1即预测错误,则代价cost趋于无穷大。

    这个代价函数表示在坐标系上是一个凹函数,这样我们需要一步步靠近局部最底部,最终就能找出最优值

     

    利用梯度下降法,通过对w的不断迭代,直至逼近最优解且收敛,有公式:

    公式首先计算整个数据集的梯度(代价),然后使用alpha(学习率) x gradient(梯度)来更新回归系数。

    这里面η表示学习率,可以理解为逼近最优解过程中每一步的速度,如果把它设置为一个常量,则迭代将会匀速靠近最优解,实际上我一开始就是这样做的,这样做的问题是,如果η设置的比较大,则代价会极不稳定,达不到收敛效果,因为每次更新w时幅度太大,很有可能越过最优解,达不到优化效果;而如果η设置的比较小,虽然最后能达到收敛效果且收敛到最优解附近,但是耗时太长,如果数据集很大的话,这种将要花费极大的时间。

    比较理想的方法是梯度下降中使用动态学习率,即需要随着迭代的进行,同时调整学习率,初始学习率较大,而随后逐渐减小,这样既能省时又能最终达到收敛效果。在实验报告的优化部分有展示动态学习率相比于恒定学习率的优点。

     

    随机梯度下降:梯度下降算法一般指批量梯度下降,在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),计算出下降最快的方向,然后踏出一步,这属于一次迭代,更新一次w值,该方法对小数据集效果很好,但应用于大数据集,则它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数,这个方法叫随机梯度下降算法。它克服了批量梯度下降复杂度高的缺点,但是它也有缺点:就是它每次迭代只选取一个样本进行分析,因此随机梯度下降的方向,会因为所选取的样本的具体不同而不同,从而在整体方向上会显得左右摇摆。这一点在优化部分也会有展示。

    最后迭代到一定次数后,即可用这个训练好的w向量,根据最前面那条公式对测试集进行预测了。

    2、伪代码

    读取文件、写入文件以及计算准确率等之前实验做过的或者过于简单的函数功能不列出。
    int main()
    {
    	读取训练集和测试集,其中训练集每三个样本取前两个作为训练集,第三个作为验证集。
    	初始化w:for(int i=0;i<Length;i++) w[i]=1;
    	for(int k=0:7)
    		for(int i=0:traincnt)//遍历训练集样本
    		{
    			CalWeight(i);//计算样本i的权重分数
    			CalCost(i);//每一维的梯度(代价)计算
    			Updatew();	//更新w
    			if(i%20==0)	//每更新w20次计算一次准确率
    			{
    				Predict();//预测验证集样本
    				Cal_acc();//计算准确率 
    				ac[cnt]=accuracy;				
    				cnt++;
    			}										
    		}
    	output_result();//输出验证集准确率以供调试
    	output_test_result();//输出测试集预测结果
    }
    void CalWeight(int index){
    	weight=当前向量w的转置*样本i向量;
    }
    void CalCost(int index){
    	计算每一维的梯度,存储在向量数组Cost[]中;
    }
    void Updatew(){
    	使用w= w - alpha x gradient来更新回归系数(w)
    }
    void Predict(){
    	P=1/(1+exp(-1* w^T *样本i向量);
    	if(P>0.5) p_label=1;
    	else p_label=0;
    }

    3、实现效果

    读取train文件时每三个样本,前两个读入训练集,第三个读入验证集;使用批梯度下降方法和动态学习率,下图是迭代过程中用模型预测验证集时准确率的曲线变化:

     

     

    上面三个图分别是迭代开始(左)、迭代过程中(中)、迭代结束(右)时的准确率,可见前两个图中,准确率一直在提高,说明梯度一直在下降,且迭代刚开始时准确率提升幅度很大而迭代中途提升幅度已经减慢了很多,说明实现了动态学习率方法,而在最后一个图中,准确率已经不再变化,稳定在0.7738,说明已经到达收敛,梯度下降已经到达最优解。

    4、完整代码以及实验数据文件

    逻辑回归算法C++代码及实验数据
    展开全文
  • 回顾一下线性回归,一般都是用商业数据集,进程数据预测,分析系统,核心是算法为主。 深度学习,主要是图像处理,文本处理,比如云字典 最小二乘法的数学推导过程,我们只要知道结果是可靠的就行 ...机器学习有1.

    在这里插入图片描述
    回顾一下线性回归,一般都是用商业数据集,进程数据预测,分析系统,核心是算法为主。
    深度学习,主要是图像处理,文本处理,比如云字典

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最小二乘法的数学推导过程,我们只要知道结果是可靠的就行

    在这里插入图片描述
    在这里插入图片描述
    numpy的实现方式

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    用鸢尾花的数据,分类的例子,对1类和2类的分类

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    现在的分类其实是有一些问题,线性回归分类的时候会存在一些数学基础上的不可靠

    在这里插入图片描述
    身高和年龄数据也是线性,如果要分类就要采用鸢尾花的数据了,多类分类

    从线性回归的缺陷,引申到逻辑回归的意义,线性回归就提出了线性的拟合。机器学习有10大经典算法,神经网络4大算法,自适应谐振理论(ART)网络,学习矢量量化(LVQ)网络,Kohonen网络,Hopfield网络

    高中数学偏计算,大学偏推理。
    算法模型是什么,算法怎么去求解,算法如何去实现,实现的时候分成三种模式去实现(原生实现,框架实现(一般用sklearn,机器学习的框架,tensorflow),

    在这里插入图片描述
    地球上无数的曲线,不论你能否表现成方程,里面是可以用分段函数无穷逼近的。后来有人发明了三角分段,成为规律型的来叠加。后面矩阵的叠加不靠谱,又有了正弦波叠加的方式。这样就是把无规律变成有规律

    儿女的身高一般比父母的平均身高要低,回归到人类的平均身高,线性拟合或者线性接近
    在这里插入图片描述
    算法推导后,目标值,是要把算法中的值求出来

    最后得到一个误差损失函数,今天用梯度下降法,这个是比较可靠的
    在这里插入图片描述
    用tensorflow实现一把线性回归,numpy数值计算库(在python内建类型,列表上面,添加了向量,矩阵类型的数据集合,结构化数据里的东西)

    之前用最小二乘法得出了一个结论

    在这里插入图片描述
    an乘以n次方-1乘以x的n-1次方,上标^,下标_
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    可以变成一个矩阵
    在这里插入图片描述
    这个就是形成矩阵的模型。就是类型
    在这里插入图片描述
    写成矩阵的方式是便于推理,这个就是鼎鼎大名的线性回归的决策模型,任何一个模型都有决策模型
    在这里插入图片描述
    在这里插入图片描述

    身高在10岁之前成正比,可以当作线性的,但是10岁以后就不行了
    在这里插入图片描述
    在决策模型和求解模型中间还有过度模型,称为损失函数

    在这里插入图片描述
    关键是把w求出来,进行分类和回归。
    x是身高的数据,y是年龄的数据

    在这里插入图片描述
    训练的数据就是要求解的数据(w)
    在这里插入图片描述
    占位定义,使用tensorflow里专门的类型占位符placeholder,tensorflow自己定义了数据类型,跟numpy一样,如果数据样本行数不确定,可以用-1或者None,剩下是数学样本的特征(多列就是多个特征,鸢尾花就是4个特征)

    在这里插入图片描述
    结果的数据是未知的
    在这里插入图片描述
    下面定义训练模型,直接使用w
    在这里插入图片描述

    定义决策模型,求它的逆矩阵,就是xw,w这个模型目前还没有
    在这里插入图片描述
    先求值再决策,先决策再求值是有区别的,决策模型之前先求解W
    在这里插入图片描述
    w首先把x转置求出

    在这里插入图片描述
    然后求内积

    在这里插入图片描述
    求完内积求逆矩阵
    在这里插入图片描述
    、再求转置和内积
    在这里插入图片描述
    tensorflow里有transpose,给x,就得到了一个转置矩阵
    在这里插入图片描述
    下面需要求内积

    在这里插入图片描述
    然后求逆矩阵,matrix_inverse 矩阵求逆
    在这里插入图片描述
    再求和转置矩阵的内积
    在这里插入图片描述
    在这里插入图片描述
    再求内积
    在这里插入图片描述
    tensorflow里可以用仪表盘的方式展示怎么算的

    执行求解的时候首先要把数据格式化
    在这里插入图片描述
    现在看到的是一行的矩阵,变成一个2*2的矩阵
    在这里插入图片描述
    输出的数据变成2维
    在这里插入图片描述
    第一列是x,第二列全是1,定义数组,把数据放进去
    在这里插入图片描述

    创建一个会话环境,初始化数据(是空的,愿意做可以做,不愿意做也没事)
    在这里插入图片描述
    下面要计算w,凡是求值或者输出的用v_前缀表示,求w可以用session,计算需要两个值,x和y
    在这里插入图片描述
    用字典的方式输出数组
    在这里插入图片描述
    预测模型最后求出来的其实是线性回归的模型
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    这里就是预测的模型
    在这里插入图片描述

    在这里插入图片描述
    做可视化,可以加魔法指令,在线显示
    在这里插入图片描述
    构建图,构建坐标,绘制样本,绘制线性回归直线,最后显示

    边界保留10像素0.1
    在这里插入图片描述
    y方向也保留10个像素。宽度80%

    在这里插入图片描述
    在这里插入图片描述
    x是年龄,放在0-10之间,y是身高,scatter是散点值。color(0,0,1,1)是蓝色,标签训练样本
    在这里插入图片描述
    legend主题
    在这里插入图片描述
    在这里插入图片描述
    这个就是样本点
    在这里插入图片描述
    2位数

    在这里插入图片描述
    在这里插入图片描述
    绘制线性回归直线
    在这里插入图片描述
    标记可以换成小点

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 决策模型在学习中有一个重要的因素损失函数(并不是每一个公式都可以拿最小二乘法解) 线性回归除了做预测还可以做分类,比如鸢尾花数据 这个算法是用了sklearn 定义一个线性回归的对象,然后把数据放进去开始训练...
  • 这几个算法其实逻辑差不多 避免算出的极小值不靠谱,就有凸优理论 梯度下降并不是一个精确值,但是+w,和-w就要判断导数的正负数在哪里 梯度下降在右边就是负的,减号 损失函数写好,就是小写的l 也可以用...
  • 机器学习 java 逻辑回归算法
  • 文章目录逻辑回归算法逻辑回归概念Sigmoid函数逻辑回归模型代价函数最终运用梯度下降求解实验总结 逻辑回归算法 首先明确一个概念,逻辑回归并不是解决回归问题,而是解决分类问题,它是通过训练数据中的正负例,...
  • 逻辑回归算法1.算法概述2.算法步骤3.算法优化 1.算法概述 逻辑回归算法是一种广义的线性回归分析方法,其仅在线性回归算法的基础上,套用一个逻辑函数,从而对事件发生的概率进行预测。 逻辑回归算法常用于数据挖掘...
  • 原创文章,如需转载请保留出处 本博客为唐宇迪老师python数据分析与机器学习实战课程...逻辑回归算法原理推导 1.1 逻辑回归(Logistic regression) == 目的:经典的二分类算法 == 1.2 Sigmoid函数 二.逻辑回归求解 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,810
精华内容 2,324
关键字:

机器学习逻辑回归算法