四、回归算法
    4.1线性回归
        4.1.1线性回归的原理
            回归问题-目标值是连续型数据
            1、线性回归的应用场景
                1)房价预测
                2)销售额度预测
                3)贷款额度预测
            2、什么是线性回归
                特征值和目标值之间的关系是一种函数关系 
                1)定义
                    线性回归是利用回归方程(函数)对一个或多个自变量(特征值)和
                    因变量(目标值)之间关系进行建模的一种分析方式
                2)特点
                    只有一个自变量的情况称为单变量回归,
                    多于一个自变量情况的称为多元回归。
                3)公式
                    特征值:x
                    目标值:y=h(w)=w1x1 + w2x2 + w3x3 + …… + wnxn + b= wTx + b
                                    其中w是回归系数(权重值),b是偏置,w b统称为模型参数;上式满足线性关系,称为线型模型
                                    PS:矩阵乘法 wT=[w1,w2,...,wn,b] x=[x1,x2,...,xn,1]T
                    *求一组合适的w1 w2 ... wn b使上式成立
                    线型模型例子:
                        期末成绩=0.7×考试成绩+0.3×平时成绩
                        房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
                4)广义线性模型
                    线性模型有两种情况:
                        自变量x是一次的,例如上述公式
                        参数w是一次的,例如y = w1x1 + w2x1^2 + w3x1^3 + w4x2^3 + …… + b
                    非线性关系?==>曲线也属于线性模型
                    注意区别线性关系&线性模型的关系:
                        线性关系一定是线性模型
            线性模型不一定是线性关系
                    PS:单特征与目标值呈线线关系,二特征与目标值呈平面关系                    
        4.1.2线性回归的损失与优化原理(理解记忆)
            1、目标:求模型参数(w b)并且使模型参数能够使得预测准确
            2、例子
                1)
                    真实关系:真实房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
            随意假定:预测房子价格 = 0.25×中心区域的距离 + 0.14×城市一氧化氮浓度 + 0.42×自住房平均房价 + 0.34×城镇犯罪率
                2)我们希望缩小预测房子价格和真实房子价格的差距(通过不断改进参数)
                    损失函数/cost/成本函数/目标函数(衡量上述差距)-- 最小二乘法
            3、优化算法-缩小损失
                如何求模型中的w,是的损失最小?(目的是找到最小损失对应的w值)
                1)方法一:正规方程(公式详解见视频)
                    比喻“天才”--直接公式求解W
                    理解:X为特征值矩阵,y为目标值矩阵。直接求到最好的结果
                    缺点:当特征过多过复杂时,求解速度太慢并且得不到结果
                    拓展:
              1)假设a>0,试求y的最小值
                  y = ax^2 + bx + c
                  y' = 2ax + b = 0
                  x = - b / 2a
                PS:正规方程W类似上述过程,只不过x和y都为矩阵,涉及到矩阵求导,都是直接求解到最小值
              2)矩阵求逆
                  a * b = 1 ==> b = 1 / a = a ^ -1
                  A * B = E ==> B = 1 / A = A ^ -1
                  [[1, 0, 0],
                  [0, 1, 0],
                  [0, 0, 1]]          
                2)方法二:梯度下降(常用)(公式详解见视频)
                    比喻“勤奋”--不断试错和改进
        4.1.3API
            1、sklearn.linear_model.LinearRegression(fit_intercept=True)
                    1)LinearRegression类通过正规方程优化
                    2)参数:
                        fit_intercept:是否计算偏置,默认True
                    3)属性:
                        LinearRegression.coef_:回归系数
                        LinearRegression.intercept_:偏置
            2、sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
                    1)SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型
                    2)参数:
                        loss:损失类型
                            默认=”squared_loss”,即普通最小二乘法
                        max_iter:迭代次数
                        fit_intercept:是否计算偏置
                        learning_rate : 学习率eta,string, 可选
                            学习率填充:
                                'invscaling': eta = eta0 / pow(t, power_t)
                                        power_t=0.25(0.25次方):存在父类当中
                                'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
                                'constant': eta = eta0 = 0.01
                                        对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率
                    3)属性:
                        SGDRegressor.coef_:回归系数
                        SGDRegressor.intercept_:偏置
        4.1.4案例:波士顿房价预测
            1)获取数据集
            2)划分数据集
            3)特征工程:
                无量纲化 - 标准化
            4)预估器流程
                fit() --> 模型coef_ intercept_
            5)模型评估(见4.1.5)
        4.1.5回归性能评估
            1、均方误差MSE评价机制(公式详解见视频)
                sklearn.metrics.mean_squared_error(y_true, y_pred)
                    1)均方误差回归损失
                    2)参数:
                        y_true:真实值
                        y_pred:预测值
                    3)返回值:return浮点数结果,越小越好
            2、正规方程和梯度下降两种回归模型对比
                    1)梯度下降
                        需要选择学习率;需要迭代求解;特征数量较大时可以使用
                    2)正规方程
                        不要要选择学习率;一次运算得出;需要计算方程,时间复杂度较高O(n^3)
            3、算法选择依据:
                    1)小规模数据:
                        正规方程(不能解决拟合问题)
                        岭回归
                    2)大规模数据:
                        梯度下降
        4.1.6扩展-梯度下降的优化方法
            原始的梯度下降(gradient descent,GD)需计算所有样本的值才能得出梯度,计算量大,以下为改进:
            1、FGD
                全梯度下降算法(Full gradient descent)
                在进行计算的时候,计算所有样本的误差平均值,作为我的目标函数
            2、SGD
                随机梯度下降算法(Stochastic gradient descent)
                每次迭代时只选择一个样本进行考核
            3、SAG
                随机平均梯度下降算法(Stochastic average gradient descent)
                会给每个样本都维持一个平均值,后期计算的时候,参考这个平均值
    4.2欠拟合与过拟合
        4.2.1什么是欠拟合与过拟合
            1、欠拟合
                一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
            2、过拟合
                一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
        4.2.2原因及解决办法
            1、欠拟合原因以及解决办法
                原因:学习到数据的特征过少
                解决办法:增加数据的特征数量
                    1)添加其他特征项
                    2)添加多项式特征
            2、过拟合原因以及解决办法
                原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
                解决办法:
                    1)重新清洗数据
                    2)增大数据的训练量
                    3)正则化(见下述)
                    4)减少特征维度
            3、正则化-通过限制高次项的系数进行防止过拟合
                1)什么是正则化
                    在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题,除了一些算法本身作用之外(决策树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征。
                    在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化。
                    注:调整时候,算法并不知道某个特征影响,而是去调整参数得出优化的结果。
                2)正则化类别
                    L2正则化-把高次项前面的系数变成特别小的值(常用)
                        作用:可以使得其中一些W的都很小,都接近于0,削弱某个特征的影响
                        优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
                        又称Ridge(岭)回归(见4.3)
                    L1正则化-直接把高次项前面的系数变为0
                        作用:可以使得其中一些W的值直接为0,删除这个特征的影响
                        又称LASSO回归
                    PS:损失函数 + λ惩罚项(公式详解见视频)
    4.3线性回归的改进-岭回归
            1、岭回归实质为具有L2正则化的线性回归,达到解决过拟合的效果
            2、API
                1)具有L2正则化的线性回归
                sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
                    参数:
                        alpha:正则化力度=惩罚项系数,也叫 λ
                            λ取值:0~1 1~10
                        solver:会根据数据自动选择优化方法
                            sag(随机平均梯度下降算法):如果数据集、特征都比较大,选择该随机梯度下降优化
                        normalize:数据是否进行标准化
                            normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
                    属性:
                        Ridge.coef_:回归权重
                        Ridge.intercept_:回归偏置
                    PS:Ridge方法相当于SGDRegressor(penalty='l2', loss="squared_loss"),只不过SGDRegressor(4.1.3-2)实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)
                2)具有L2正则化的线性回归&可以进行交叉验证
                    sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
            3、观察正则化程度的变化,对结果的影响?
                1)正则化力度越大,权重系数会越小
                2)正则化力度越小,权重系数会越大
            4、案例:波士顿房价预测
    4.4分类算法-逻辑回归与二分类
        逻辑回归是机器学习中的一种分类模型,但其与回归有一定的联系。
        4.4.1逻辑回归的应用场景
              广告点击率-是否会被点击
        是否为垃圾邮件
        是否患病
        是否为金融诈骗
        是否为虚假账号
        从上面例子不难发现都属于两个类别(正例/反例)间的判断,逻辑回归正是解决二分类问题的利器。
        4.4.2逻辑回归的原理
            1、逻辑回归的输入=线型回归的输出,即g(x)中的x=线性回归的h(w)
            2、激活函数:sigmoid函数=g(x)=1/(1 + e^(-x))
                1)线型回归的结果输入到sigmoid函数中
                2)sigmoid函数输出结果:
                    [0, 1]区间的一个概率值(默认设0.5为阈值,即大于0.5认为其属于此类别,小于0.5则不属于)
                3)假设函数/线性模型:
            1/(1 + e^(-(w1x1 + w2x2 + w3x3 + …… + wnxn + b)))
        4)损失函数:
            线性回归-真实值&预测值都是数
                  [(y_predict - y_true)的平方和]/总数
              逻辑回归-真实值&预测值都是"是否属于某个类别"
                对数似然损失(cost(h(x),y)公式详解见视频)
        5)优化损失
          梯度下降
        4.4.3API
            sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
                1、solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'},    
                    1)默认: 'liblinear';内部使用坐标轴下降法来迭代优化损失函数;用于优化问题的算法。
                    2)对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快。
                    3)对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
                    4)sag:根据数据集自动选择,随机平均梯度下降。
                2、penalty:正则化的种类
                3、C:正则化力度
                4、默认将类别数量少的当做正例
                PS:LogisticRegression方法相当于SGDClassifier(loss="log", penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习,
                也支持平均随机梯度下降法(ASGD),可通过设置average=True。而使用LogisticRegression(实现了SAG)
        4.4.4案例:癌症分类预测-良\恶性乳腺癌肿瘤预测
            1、默认:恶性(类别数量少) - 正例
        2、流程分析:
            1)获取数据
                读取的时候加上names
            2)数据处理
                处理缺失值
                确定特征值、目标值
                            数据集划分
            3)特征工程-标准化
            4)机器学习-逻辑回归预估器
            5)模型评估
        3、真的患癌症的,能够被检查出来的概率 - 召回率(4.4.5)
        4.4.5分类的评估方法
            1、精确率和召回率
                1)混淆矩阵
                    在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
                                |                |          预测结果
                    ------|-------|-------------------
                                |                |    正例          假例
                    ------|-------|-------------------
                    真实    | 正例    |    真正例TP    伪反例FN
                    结果    |-------|-------------------
                                | 假例    |    伪正例FP    真反例TN
                    TP = True Possitive
          FN = False Negative
                2)精确率(Precision)与召回率(Recall)
                    准确率=(TP+TN)/(TP+TN+FN+FP)(对不对)
                    精确率=TP/(TP+FP)(查的准不准);预测结果为正例样本中真实为正例的比例(预测结果中有多少是真正预测正确的)
                    召回率=TP/(TP+FN) (查的全不全);真实为正例的样本中预测结果为正例的比例(查得全,对正样本的区分能力)(真是结果的正例有多少被预测对了)
                3)其他评估标准之F1-score(反映了模型的稳健型)
                    F1=2TP/(2TP+FN+FP)=2*Precision*Recall/(Precision+Recall)
                4)分类评估报告API
                    sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
                        y_true:真实目标值
                        y_pred:估计器预测目标值
                        labels:指定类别对应的数字
                        target_names:目标类别名称
                        return:每个类别精确率与召回率
        2、ROC曲线与AUC指标
            1)TPR与FPR
                TPR = TP / (TP + FN)        (TPR实质为召回率)
                    所有真实类别为1的样本中,预测类别为1的比例
                FPR = FP / (FP + TN)
                    所有真实类别为0的样本中,预测类别为1的比例
            2)ROC曲线
                ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5
            3)AUC指标
                AUC的概率意义是随机取一对正负样本,正样本得分大于负样本得分的概率
                AUC的范围在[0, 1]之间,并且越接近1越好,越接近0.5属于乱猜
                AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器    
                0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值
                最终AUC在[0.5,1]之间,并越接近1最好
            4)AUC计算API
                sklearn.metrics.roc_auc_score(y_true, y_score)
                    计算ROC曲线面积,即AUC值
                    y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
                    y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值
            5)AUC只能用来评价二分类,AUC非常适合评价样本不平衡中的分类器性能
    4.5模型保存与加载
        当训练或者计算好一个模型后,那么如果别人需要我们提供结果预测,
        就需要保存模型(主要是保存算法的参数)
        4.5.1sklearn模型的保存和加载API
            from sklearn.externals import joblib
                保存:joblib.dump(estimator, 'test.pkl')
                加载:estimator = joblib.load('test.pkl')
                注意:
                    1.保存文件,后缀名是**.pkl
                    2.加载模型是需要通过一个变量进行承接
        4.5.2线性回归的模型保存加载案例
            day3.py-linear3()

五、聚类算法
    5.1无监督学习之K-means算法
        5.1.1什么是无监督学习
            没有目标值 - 无监督学习
        5.1.2无监督学习包含的算法
            聚类
          K-means(K均值聚类)
      降维
          PCA
        5.1.3K-means原理
            步骤:
                1)随机设置K个特征空间内的点作为初始的聚类中心
                2)对于其他每个点计算到K个中心的距离,位置的点选择最近的一个聚类中心作为标记类别
                3)接着对标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
                4)若计算出来的新中心点与原中心点一样,则结束;否则重新进行第二步
        5.1.4K-meansAPI
            sklearn.cluster.KMeans(n_clusters=8,init="k-means++")
                参数:
                    n_clusters:开始的聚类中心数量整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数
                    init:初始化方法,默认="k-means++"
                属性:
                    labels_:默认标记的类型,可以和真实值比较(不是值比较)
                方法:
                    estimator.fit(x)
                    estimator.predict(x)
                    estimator.fit_predict(x)
                计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
        5.1.5案例:K-means对Instacart Market用户聚类
            k = 3
      流程分析:
          继PCA降维之后的数据
              1)预估器流程
              2)看结果
              3)模型评估(5.1.6)
        5.1.6K-means性能评估指标
            1、误差平方和(SSE \The sum of squares due to error)
            2、“肘”方法 (Elbow method) — K值确定
            3、轮廓系数法(Silhouette Coefficient)
                1)"高内聚,低耦合"--内部距离最小化,外部距离最大化
                2)S=(b-a)/max(b,a)
                    i为某已聚类数据中的样本
                    b为i到其他族群的所有样本的距离的最小值(外部距离)
                    a为i到本身族群的所有样本的距离的平均值(内部距离)
                3)轮廓系数法结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。
                    轮廓系数的值是介于 [-1,1],越趋近于1代表凝聚度和分离度都相对较优。
                    如果b>>a:S趋近于1,效果越好;
          如果b<<a:S趋近于-1,效果不好。
          求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。
                    平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。
          4)API
              sklearn.metrics.sihouette_score(X,labels)
                  计算所有样本的平均轮廓系数
                  参数:
                      X:特征值
                      labels:被聚类标记的目标值
            4、CH系数(Calinski-Harabasz Index)
        5.1.7K-means总结
            1、特点:采用迭代式算法,直观易懂并且非常实用
            2、缺点:容易收敛到局部最优解(多次聚类)
            3、应用场景:没有目标值(一般在分类之前做)