
一、线性回归1.线性回归算法线性回归是利用数理统计种回归分析来确定或两种以上变量间相互依赖的定量关系的一种统计分析方法。数据规律呈现线性关系。简单来说我们就要找出那条线当然实际问题中所有点是不可能全部落在直线上所以我们求到的直线是点到它的距离最小。2.线性回归模型介绍1一元线性模型现在有一个案例自变量为工资因变量为贷款额度工资影响贷款额度。根据上面我们搭建一个一元线性回归模型这里的β0和β1是模型的参数后面是误差项它不属于直线的表达式也就是说β1是直线斜率β0是截距。2多元线性模型上面是只有一个自变量下面我们建造多元模型和一元线性是一个道理3误差项分析误差项不能省略是一定会产生的当这条直线是所有点到直线距离都比较小的那条直线这时候误差项满足高斯分布也就是这里的满足高斯分布又称正态分布。关于对误差项分析涉及到数学公式和式子化简这里就不论述经过数学方法后会得到能够求得β得最小值4相关系数变量之间是否有关数学中我们也学过这个是用来研究和度量变量间相关性一般用r表示5拟合优度直线拟合是否是最优的使用判定系数R^23.线性回归实例1一元线性回归会用到sklearn库数据预测广告投入的销售额代码实现import pandas as pd from sklearn.linear_model import LinearRegression #导入数据 datapd.read_csv(data.csv,encodingutf-8,enginepython) #打印相关系数矩阵 corrdata[[广告投入,销售额]].corr() #估计模型参数建立回归模型 lr_modelLinearRegression()#回归模型 xdata[[广告投入]]#分为数据x和标签y ydata[[销售额]] lr_model.fit(x,y)#训练 #对回归模型进行检验 score在这的用处:调整R方判断自变量对因变量的解释程度 R方越接近1自变量对因变量的解释就越好 F检验方程整体显著性检验 T检验方程系数显著性检验 score给的是R方 scorelr_model.score(x,y) print(score) #利用回归模型进行预测 print(lr_model.predict([[29]])) print(lr_model.predict([[25],[31]])) a:自变量b截距 alr_model.coef_ blr_model.intercept_ # print(a,b,type(a),type(b)) print(线性回归模型为y{:.2f}x{:.2f}.format(a[0][0],b[0]))2多元线性回归1数据400多条预测糖尿病分别为年龄性别bmi值bp值……target为糖尿病指标值import pandas as pd from sklearn.linear_model import LinearRegression #导入数据 datapd.read_csv(糖尿病数据.csv,encodingutf-8,enginepython) #打印相关系数矩阵 corrdata[[age,sex,bmi,bp,s1,s2,s3,s4,s5,s6,target]].corr() #估计模型参数建立回归模型 lr_modelLinearRegression() xdata[[age,sex,bmi,bp,s1,s2,s3,s4,s5,s6]] ydata[[target]] lr_model.fit(x,y) #对回归模型进行检验 scorelr_model.score(x,y) #利用回归模型进行预测 print(lr_model.predict([[0.038075906,0.050680119,0.061696207,0.021872355,-0.044223498, -0.034820763,-0.043400846,-0.002592262,0.019908421,-0.017646125]])) alr_model.coef_#系数 blr_model.intercept_#截距 # print(a,b,type(a),type(b)) print(线性回归模型为y{:.2f}x0{:.2f}x1{:.2f}x2{:.2f}x3{:.2f}x4{:.2f}x5 {:.2f}x6{:.2f}x7{:.2f}x8{:.2f}x9{:.2f}.format(a[0][0],a[0][1],a[0][2],a[0][3] ,a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9],b[0]))该数据预测误差很大这涉及很多个方面。4.总结无论多元还是一元方法都是一样的二、逻辑回归1.逻辑回归介绍是分类算法如果把线性回归看作离所有点最近的一条直线那逻辑回归就是一条直线把类别不同的的数据点在其上的投影对应的区域分开分类有两种二分类和多分类2.二分类数据分为两类一类打上标签1一类打上标签0因为模型判断类别时只能输出数值判断出是1类就会输出1是0类就输出0例如一条直线方程为yα1xxα2 如下图我们有两种数据输出y值人眼很容易看出是两类机器怎么分辨如果给一个新数据要去预测属于哪一类机器又该怎么判断所以虽然是二分类但是我们要利用空间直角坐标系再引出一个维度Y下面加入一个维度也引进一个函数这个函数图像是这里的x就是我们图上的y就是这么一个数学过程3.具体例子上述只是我们理解的过程我们主要要对代码实现银行贷款例子下面是我们的数据银行根据用户信息进行判断是否要贷款给用户0是同意贷款1是不同意贷款这里数据有上万条没展示完全任务就是训练让其能进行预测是否贷款给用户另外我们这里的数据是经过z标准化处理过的但不仅仅是z处理而是脱敏处理这是因为有些数据需要安全保护从标准化方面讲由数值有正有负可以看出是z标准化其中有Amount列没有标准化Time是用户登记的时间一般银行进行业务的窗口不止有一个所以时间有一样的这里Time并没有什么用前面都是数据最后target就是最后结果。我们绘图时原则上是不支持出现中文的但是在这里我们导入sklearn中的metrics就可以画图的时候出现中文了import pandas as pd from sklearn.preprocessing import scale import matplotlib.pyplot as plt from pylab import mpl from sklearn.model_selection import train_test_split#专门用来对数据集进行切分的函数 from sklearn.linear_model import LogisticRegression#逻辑回归的类所有的算法都封装再这个类里面 from sklearn import metrics 整理我们进行逻辑回归的数据 datapd.read_csv(rE:\filedata\creditcard.csv)#读取文件 # print(data.head)#输出前五行的数据检测文件是否被读取 data[Amount]pd.DataFrame(scale(data[Amount]))#把Amount列也进行标准化 datadata.drop([Time],axis1)#用不到的Time列删去 绘制图型前要准备的 mpl.rcParams[font.sans-serif][Microsoft YaHei] mpl.rcParams[axes.unicode_minus]False#选择表格上中文的格式 value_countpd.value_counts(data[Class])#统计各类别的个数 print(value_count,type(value_count))#输出各类别个数 绘制图形 plt.title(正负例样本数)#标题 plt.xlabel(类别)#x轴标签 plt.ylabel(频数)#y轴标签 value_count.plot(kindbar)#设置图像类型为bar,条形图 plt.show()#显示数据分布 建立模型处理数据 X_datadata.drop(Class,axis1) Y_datadata.Class 对数据集进行划分 x_train,x_test,y_train,y_testtrain_test_split(X_data,Y_data,test_size0.3,random_state1000) #这里对数据的划分0.3的意思是百分之三十作为测试集这数据不是按照文件按顺序分配的 #而是随机抽取的并且我们这里还用到了种子 #也就是说随机抽取的数据抽取后是训练集那后面就一直是训练集是预测值就一直是预测值 lrLogisticRegression(C0.01)#关于这里的C参数我们会放到后面去讲现在只需要用着这个参数 lr.fit(x_train,y_train)#训练 测试集预测结果 testprelr.predict(x_test)#预测 completelr.score(x_test,y_test)#预测准确率 print(testpre,complete) 获取分类结果报告 print(metrics.classification_report(y_test,testpre))输出4.关于上述代码获取分类报告分析上述输出结果第一个输出是对各类型的个数进行统计并绘图由图可以看出我们的类型之间数量差距是很大的正确率也达到了百分之99点多正确率那么高虽看着很好但其实很误导人这个模型是不能拿去使用的首先我们训练数据中0类和1类数量差距很大这也会让训练后的模型不准确基本上输出全为0计算正确率时由于0类比较多准确率也会很高。这会牵扯到召回率和精确率这两个含义。例如假设要对15个人预测是否患病使用1表示患病0表示正常预测结果如下下面根据上面信息列出来的叫做混淆矩阵TPTrue Positive5 FPFalse Positive4FNFalse Negative2 TNTrue Negative41准确率预测值与真实值一致的情况accuracy准确率TPTN/(TPTNFPFN)2召回率从真实值出发真实值为1的情况下有多少个被预测出来了recallTP/TPFN3精确率预测值中有多少被预测正确了precisionTP/TPFP4F1值scoreF12*precision*recall/precisionrecall5特异率specificityTN/TNFP我们所做的模型几乎都是要落实于现实中的现实中有些事情的处理就要本着“宁可错杀也不放过一个”的原则。例如预测人是否生病没生病人就不会进一步检查要是被模型预测出生病至少他们会去医院进行检查再次确认。所以就算有一点可能我们的模型都不能判定人没病银行系统和医疗系统是一个道理都想尽可能的分辨出有异常的也就是比较关注召回率。所以我们可以打印出分类结果报告查看召回率。5.C0.01中C是什么在上述代码中有一处参数C0.01这里的参数会涉及到模型的拟合程度模型的拟合程度分为两种1欠拟合模型没有训练好2过拟合模型再训练集中表现良好但是在测试集上就不行了原因是在训练集上为了追求好的效果包括损失大小准确率高……模型参数太过于复杂p2就是比较正常的情况我们允许有一些异常数据欠拟合的模型可以多进行训练通常我们训练好模型后再用训练集进行自测来查看是否欠拟合关键是过拟合的模型存在的问题该怎么解决是需要我们思考的用来解决过拟合我们可以使用正则化惩罚而这里的参数C就是控制正则化惩罚程度的关键参数6.正则化惩罚我们要求损失函数的最小值会存在我们输入数据时有两种或多种权重值满足最小值的要求我们要选择最优的那个举一个例子也就是说输入x[1,1,1,1]满足最小值的的有权重1w1[1,0,0,0]对应式子为y1*x10*x20*x30*x4权重2w2[0.25,0.25,0.25,0.25]对应式子为y0.25*x10.25*x20.25*x30.25*x4带入后两个式子值是一样的那到底该选择哪个下面式子是线性回归/逻辑回归的损失函数后面加上的就是正则化惩罚项正则化惩罚的功能主要用于惩罚权重参数w一般有L1和L2正则化w1带入L1为1先把放一边w2带入L1为1所以从L1中比较不出w1和w2哪个比较好w1带入L2为1(先放一边)w2带入L2为4*0.25^21/4损失函数损失越小越好所以我们这里选择w2选择的标准其实就是w1权重有三个零这样无论未知数为多少都为0只有x1自己发挥作用而w2中权重分布比较均匀每个未知数值都能发挥其值的作用。