模型的假设检验
F检验:提出原假设和备泽假设 之后计算统计量与理论值 最后比较
F检验主要检验的模型是否合理
# 导⼊第三⽅模块
import numpy as np # 计算建模数据中因变量的均值
ybar=train.Profit.mean() # 统计变量个数和观测个数
p=model2.df_model n=train.shape[0] # 计算回归离差平⽅和
RSS=np.sum((model2.fittedvalues-ybar)**2) # 计算误差平⽅和
ESS=np.sum(model2.resid**2) # 计算F统计量的值
F=(RSS/p)/(ESS/(n-p-1)) print('F统计量的值:',F) F统计量的值:174.6372
计算出来的计量值174.64远远大于F分布的理论值2.5所以应当拒绝原假设(先假设模型不合理)
# 导⼊模块
from scipy.stats import f # 计算F分布的理论值
F_Theroy = f.ppf(q=0.95, dfn = p,dfd = n-p-1) print('F分布的理论值为:',F_Theroy) out: F分布的理论值为: 2.5026
T检验
T检验更加侧重于检验模型的各个参数是否合理
model.summary() # 绝对值越小影响越大
线性回归模型的短板
1.自变量的个数大于样本量
2.自变量之间存在多重共线性
解决线性回归模型的短板
岭回归模型
在线性回归模型的基础之上添加一个I2惩罚项(平方项、正则项)
该模型最终变成求解圆柱体与椭圆抛物线的焦点问题
糖尿病案例:
# 导入第三方模块
import pandas as pd import numpy as np from sklearn import model_selection from sklearn.linear_model import Ridge,RidgeCV import matplotlib.pyplot as plt # 读取糖尿病数据集
diabetes = pd.read_excel(r'diabetes.xlsx') # 构造自变量(剔除患者性别、年龄和因变量)
predictors = diabetes.columns[2:-1] # 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'], test_size = 0.2, random_state = 1234 )
# 构造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200) # 岭回归模型的交叉验证 # 设置交叉验证的参数,对于每一个Lambda值,都执行10重交叉验证
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error', cv = 10) # 模型拟合
ridge_cv.fit(X_train, y_train) # 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_ ridge_best_Lambda
# 导入第三方包中的函数
from sklearn.metrics import mean_squared_error # 基于最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True) ridge.fit(X_train, y_train) # 返回岭回归系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist()) # 预测
ridge_predict = ridge.predict(X_test) # 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict)) RMSE
Lasso回归模型
在线性回归模型的基础之上添加一个I1惩罚项(绝对值项、正则项)
该模型最终转变成求解正方体与椭圆抛物线的焦点问题
案例:
# 导入第三方模块中的函数
from sklearn.linear_model import Lasso,LassoCV # LASSO回归模型的交叉验证
lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000) lasso_cv.fit(X_train, y_train) # 输出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_ lasso_best_alpha
# 基于最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000) lasso.fit(X_train, y_train) # 返回LASSO回归的系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist()) # 预测
lasso_predict = lasso.predict(X_test) # 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict)) RMSE
交叉验证
将所以数据参与到魔性的构建和测试中,最后生成多个模型再从多个模型中筛选出得分最高(准确度)的模型
Logistic回归模型
将线性回归模型的公式做Logit变换即为Logistic回归模型
将预测问题变成了0到1之间的概率问题
混淆矩阵
准确率:表示正确预测的正负样本与所以赝本数量额比值,即(A+D)/(A+B+C+D)
正例覆盖率L表示预测的正例数在实际正例数中的比例,即D/(B+D)
负例覆盖率:表示正确的负例数在实际负例数中的比例,即A/(A+C)
正例命中率:表示正确预测的正例数在预测正例数中 的比例,即D/(C+D)
模型的评估方法
1.ROC曲线
通过计算AUC阴影部分的面积来判断模型是否合理(通常大于0.8表示OK)
2.KS曲线
通过计算两条折线之间的最大距离来衡量模型是否合理(通常大于0.4表示OK)
决策树与随机森林
决策树与随机森林
默认情况下解决分类问题(买与不买、带与不带、走与不走)
也可以切换算法解决预测问题(具体数值的多少)
数其实是一种计算机底层的数据结构,与现实不同计算机里面的数都是自上而下的生长
决策树则是算法模型中的一种概念 有三个主要的部分
根节点、枝节点、叶子节点
根节点与枝节点用于存放条件 叶子节点存放真正的数据结果
1.信息熵
eg:信息熵小相当于红绿灯的情况 信息熵大就相当于买彩票中奖的情况
2.条件熵
条件熵其实就是由信息熵再次细分而来
比如 有九个用户购买了商品五个没有购买,那么条件熵就是继续从购买不购买的用户中在选择一个条件(比如按照性别计算男个女的熵)
3.信息增益
信息增益可以反映出某个条件石是否对于最终的分类有决定性的影响
在构架决策树是根节点与枝节点所放的条件按照信息增益由大到小排列
4.信息增益率
决策树中的ID3算法使用信息增益指标实现根节点或中间节点的字段选择,但是该指标存在一个非常明显的缺点,即信息增益会偏向于取值较多的字段
为了克服信息增益指标的缺点,提出了信息增益率的概念,它的思想很简单,就是在信息增益的基础上进行相应的惩罚项
基尼指数
可以让模型解决预测问题
基尼指数增益
与信息增益类似,还需要考虑自变量对因变量的影响过程,即因变量的基尼指数下降速度的快慢,下降的越快,自变量对因变量的影响就越强
随机森林
随机森林中每颗决策树都不会限制节点字段的选择,有多颗树组组成的名叫随机森林
在解决分类问题的时候采用投票法、解决预测问题的时候采用均值法
# 导入第三方模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn import model_selection from sklearn import linear_model # 读⼊数据 Titanic = pd.read_csv(r'Titanic.csv') Titanic # 删除⽆意义的变量,并检查剩余变量是否含有缺失值 Titanic.drop(['PassengerId','Name','Ticket','Cabin'], axis = 1, inplace = True) Titanic.isnull().sum(axis = 0) # 对Sex分组,⽤各组乘客的平均年龄填充各组中的缺失年龄 fillna_Titanic = [] for i in Titanic.Sex.unique(): update = Titanic.loc[Titanic.Sex == i,].fillna(value = {'Age': Titanic.Age[Titanic.Sex == i].mean()}, inplace = False) fillna_Titanic.append(update) Titanic = pd.concat(fillna_Titanic) # 使⽤Embarked变量的众数填充缺失值 Titanic.fillna(value = {'Embarked':Titanic.Embarked.mode()[0]}, inplace=True)
# 将数值型的Pclass转换为类别型,否则⽆法对其哑变量处理 Titanic.Pclass = Titanic.Pclass.astype('category') # 哑变量处理 dummy = pd.get_dummies(Titanic[['Sex','Embarked','Pclass']]) # ⽔平合并Titanic数据集和哑变量的数据集 Titanic = pd.concat([Titanic,dummy], axis = 1) # 删除原始的Sex、Embarked和Pclass变量 Titanic.drop(['Sex','Embarked','Pclass'], inplace=True, axis = 1) # 取出所有⾃变量名称 predictors = Titanic.columns[1:] # 将数据集拆分为训练集和测试集,且测试集的⽐例为25% X_train, X_test, y_train, y_test = model_selection.train_test_split(Titanic[predictors], Titanic.Survived, test_size = 0.25, random_state = 1234)
K近邻模型
思想:根据位置样本周边的K个邻居样本来完成预测或者分类
K值的选择
1.先猜测
2.交叉验证
3.作图选择最合理的K值(准确率越大越好,MSE越小越好)
过拟合与欠拟合
过拟合:
模型过度拟合,在训练集上表现好,但是在测试集上效果差,也就是说在已知的数据集合中非常好,
但是在添加一些新的数据进来训练效果就会差很多,造成这样的原因是考虑影响因素太多,超出自变量的维度过于多了。
欠拟合:
模型拟合不够,在训练集上表现效果差,没有充分的利用数据,预测的准确度低。
距离
欧式距离 两点之间的距离
曼哈顿距离 默认两点之间有障碍物
余弦相似度 论文查重