数据科学 回归模型

线性回归

用量化特征预测连续区间的响应。

回归

回归:建立因变量y和自变量x之间的函数关系

y:希望被预测或被解释的变量,目标或响应;
x:预测变量,一般指容易获得的样本特征;

  • x向量
    • 包含一个特征,即一元回归;
    • 包含多个特征,即多元回归;
  • 函数关系f
    • f是线性,线性回归;
    • f是非线性,非线性回归;

      一元线性回归

截距
回归系数
预测值
观测值
image.png

:残差(选择直线的依据)
通过残差平方和最小可以转换为求一阶导数的零点

回归直线使残差平方和最小的直线,且通过点
,RMSE与y有相同单位或量纲;
这个求回归线的方法也叫最小二乘法。 :::info Sklearn库
—linear_model模块
—LinerRegression对象
可以用来做线性回归。 :::

  1. import pandas as pd
  2. import numpy as np
  3. from scipy import stats
  4. from matplotlib import pyplot as plt
  5. from sklearn.linear_model import LinearRegression
  6. from sklearn import metrics
  7. my_iris=pd.read_csv('C:\Python\Scripts\my_data\iris.csv',sep=',',decimal='.',
  8. header=None,
  9. names=['sepal_length','sepal_width',
  10. 'petal_length','petal_width','target'])
  11. feature_cols='petal_length'
  12. # feature_cols='sepal_width'
  13. x=my_iris[[feature_cols]]
  14. y=np.array(my_iris['sepal_length'])
  15. plt.plot(x,y,'o',alpha=0.5)
  16. linreg=LinearRegression()
  17. linreg.fit(x,y)
  18. print('f(x) = ',linreg.intercept_,'+',linreg.coef_[0],'x')
  19. pred_y=linreg.predict(x)
  20. plt.plot(x,pred_y,'g',alpha=0.5)
  21. plt.plot(np.array(x).mean(),y.mean(),'r*',ms=12)
  22. plt.gca().set_xlabel(feature_cols)
  23. plt.gca().set_ylabel('sepal_length')
  24. print('RMSE = ',np.sqrt(metrics.mean_squared_error(y,pred_y)))
  25. print('\n')

image.png

如何评价回归模型的好与不好?

给出不重复的样本,总是能找到一条回归线
image.png
但是找到的这条回归线真的有意义吗?此时就需要引入回归效果评价参数。
定义:回归平方和与样本的总平方和之比,也等于1减去残差平方和和总平方和之比。

总平方和:样本相对于样本均值的总离差。
回归平方和:由于回归函数所引入的样本相对于均值的离差,属于样本变异性中可以被回归模型解释的部分。
意义:用模型可解释部分与总离差比较,取值在0到1间。
>越靠近1,模型可解释成分越多,模型性能越好;
>越靠近0,性能越不好;
查看刚刚模型的r_square

  1. print('r_square = ',linreg.score(x,y))

image.png

线性回归与线性相关

线性相关分析 线性回归分析
线性相关系数反映两个变量的耦合程度,其中两个变量的地位平等,不能用一个变量去预测另一个。 强调回归函数的确定,直接建立起两个变量间的函数关系,以期用x去预测y。
取值:[-1,1] 取值:[0,1]
  1. print(my_iris[[feature_cols,'sepal_length']].corr())
  2. print('\n')
  3. r=np.array(my_iris[[feature_cols,'sepal_length']].corr()[['sepal_length']].
  4. iloc(0)[0])
  5. print('r = ',r)
  6. print('square of r = ',r**2)

image.png
这里可以看到petal_length和sepal_length的相关系数为0.87,他的平方正好是之前求出的r_square。

—元线性回归 x有一列特征
多元线性回归 x有多列特征
特征越多→模型越复杂→过拟合

过拟合:模型只在建模的数据上性能好,一旦面对新数据性能就非常糟糕。
建模的目的是用模型去预测新的数据。所以过拟合的问题是一定要避免的,先保留这个问题。

逻辑回归——二分类的实现

办法:在线性回归的基础上,对输出所在的连续区间做阈值划分。
如:规定模型输出值低于阈值属于一类,高于阈值则属于另一类。
用量化特征预测某事发生的概率。概率取值区间:[0,1]

Logistic回归

Logistic回归的图像

image.png

Logistic回归函数

Logistic输出:预测变量-某事件的发生概率
输入t是样本特征的线性函数作为自变量。
引入另一个概念Odds:
某事件发生的概率,记作P;
该事件的几率:该事件发生的概率与不发生的概率之比。

对log(Odds)做线性回归:

  1. import pandas as pd
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. table=pd.DataFrame({'prob':[0.01,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.99]})
  5. table['odds']=table['prob']/(1-table['prob'])
  6. table['log-odds']=np.log(table['odds'])
  7. table

image.png
通过结果可以看到几率都是正数,而对数几率则有正有负,并且关于.0,0.5对称。还可以画出三个变量的曲线

  1. #plt.subplot(2,2,1)
  2. plt.plot(table['prob'],'g')
  3. plt.plot(table['odds'],'y')
  4. plt.plot(table['log-odds'],'m')
  5. plt.legend({'probability','Odds','log_odds'})
  6. plt.ylim([-6,6])

image.png
对数几率的值域:

基于样本的特征构建线性函数,函数值对应事件的对数几率。

:::success Logistic回归就是对几率做线性回归。 ::: 优化准则:极大化所有样本的对数似然函数。

:::info sklearn库
—linear_model模块
一LogisticRegression对象
可以做Logistic回归 :::

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from sklearn.linear_model import LogisticRegression
  5. from sklearn import metrics
  6. from scipy import stats
  7. from sklearn.model_selection import train_test_split
  8. bikes=pd.read_csv("C:\Python\Scripts\my_data\\bikeshare.csv")
  9. # 注意\b 是转义字符,表示退格,所以\\表示\本身
  10. print(bikes.shape)

image.png

  1. bikes.head()

image.png
阶段1:建模
训练集:建立模型时给模型的数据。
阶段2:模型应用
测试集:模型建立后,用来测试模型性能的数据。

  1. feature_cols=['temp']
  2. x=bikes[feature_cols]
  3. bikes['above_average']=bikes['count']>=bikes['count'].mean()
  4. y=bikes['count']>=bikes['count'].mean()
  5. x_train,x_test,y_train,y_test=train_test_split(x,y)
  6. logreg=LogisticRegression()
  7. logreg.fit(x_train,y_train)
  8. #print((y_test.values))
  9. print(pd.DataFrame(np.transpose([y_test.values,logreg.predict(x_test)]),
  10. columns={'真实值','预测值'}))
  11. print('\n')
  12. print('分类准确率是:',logreg.score(x_test,y_test)) # 评分函数

image.png
image.png
对于四季非数值型数据数据的处理,可以做one-hot编码

特征取值\编码 编码_1 编码_2 编码_3 编码_4
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1

四位二进制码,编码长度=类别个数
可以将四季转换为4位的二进制编码。可以使用Pandas中的 get_dummies 函数进行四季的one-hot编码转换。

  1. bikes.groupby('season').above_average.mean().plot(kind='bar')
  2. when_dummies=pd.get_dummies(bikes['season'],prefix='season_')
  3. when_dummies.head()

image.png
image.png
使用转换后四季的编码重新构建Logistic回归模型

  1. when_dummies=when_dummies.iloc[:,1:] # 去除第一列
  2. when_dummies.head()
  3. #new_bike=pd.concat([bikes[['temp','humidity']],when_dummies],axis=1)
  4. new_bike=pd.concat([bikes[['temp']],when_dummies],axis=1)
  5. x=new_bike
  6. x_train,x_test,y_train,y_test=train_test_split(x,y)
  7. logreg=LogisticRegression()
  8. logreg.fit(x_train,y_train)
  9. y_pred=logreg.predict(x_test)
  10. #print(y_pred)
  11. print('用气温、季节同时作为预测自变量,预测的准确率为:',logreg.score(x_test,y_test))

image.png

逻辑回归的评价依据

分类的准确率,即准确分类的样本数除以样本容量。