Python逻辑回归——以车险定价为例(附代码)

一、引言

        保费定价也成为费率厘定,是保险公司运营的环节之一。其过程是根据保单(被保险人)的损失经验和其他相关信息建立模型,并且对未来的保险成本(赔款、代理人佣金、一般管理费用、理赔费用以及支持该业务所需的资本金成本)进行预测的过程。保险公司实际使用的费率还会受到市场供求关系和公司自身发展战略的影响。

        汽车保险也称机动车辆保险,失意机动车辆本身及其第三者责任等为保险标的的一种运输工具险,在非寿险井算领域中占有重要地位。车险风险的度量有三个维度:索赔概率(索赔发生的可能性)、索赔频率(给定时间区间内各风险单位发生索赔的次数)和索赔强度(平均每次索赔的额度)。车险的纯保费计算公式由索赔频率和索赔强度的期望构成。

二、模型推导

        对于车险索赔风险,响应变量Y只有两种可能的取值,即

                                    Y=1(发生索赔)    Y=0(未发生索赔)

        记被保险人的特征向量为X,考虑X和Y之间的关系。

        线性回归模型是最简单的建模方法,其优点在于计算方便(OLS估计),且容易得到边际效应(回归系数)。为使Y的预测值为0或1,在给定X的情况下,考虑Y的两点分布概率:

                                P(Y=1|X)=F(X,\beta) , P(Y=0|X)=1-F(X,\beta),

其中F(X,beta)是连接特征向量和响应变量的连接函数。

        连接函数的选取可以导出不同的模型,本例以逻辑分布的分布函数为例,即

P\left ( Y= 1|X \right )=F\left ( X,\beta \right )=\frac{exp\left \{ X'\beta \right \}}{1+exp\left \{ X'\beta \right \}}=\frac{1}{1+exp\left \{ -X'\beta \right \}}

        给定相互独立的样本,则可以使用“最大似然估计”(MLE)对参数进行统计推断,即

\hat{\beta}=maxlnL(X,Y)=max\sum Y_{i}ln(\frac{exp{X'\beta }}{1+exp{X'\beta }})+\sum (1-Y_{i})ln(1-\frac{exp{X'\beta }}{1+exp{X'\beta }})

        对于使用MLE进行估计的非线性模型,可使用准R^2或伪R^2度量模型的拟合优度,其定义为:。还尝试用偏离度(或“残差偏离度”)的概念,其定义为:

                                                  P_{seudo} R^{2}=\frac{lnL_{0}-lnL_{1}}{lnL_{0}}

        得到Logit模型的估计系数后,即可预测测试集中Y的条件概率:\hat{p_{i}}=\hat{P(Y_{i}=1|X_{i})}=\frac{exp{X_{i}'\hat{\beta}}}{1+exp{X_{i}'\hat{\beta}}}。若结果大于0.5则预测值为1。注意这里的0.5可以看作模型的阈值,阈值的选取和模型训练的结果也极强的关联。作预测的两类错误其成本可能不对称。此时应该根据具体业务的需要调整门槛值。对于Logit模型也可使用对数几率来预测其响应变量的类别,即ln{\frac{\hat{p_{i}}}{1-\hat{p_{i}}}}=X_{i}'\hat{\beta}

        逻辑回归模型的评估:常用准确率(accuracy)或错误率(error rate):

Accuracy=\frac{\sum I(\hat{Y_{i}}=Y_{i})}{n}      Erro=\frac{\sum{I(\hat{Y_{i}}\neq Y_{i})}}{n}

注意准确率或错分率并不适用于“类别不平衡”的数据。除此之外还可计算出混淆矩阵,根据混淆矩阵的信息,可设计更精细的模型评估指标。

三、代码实现

#####数据和库读入################
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import statsmodels.api as sm
from patsy import dmatrices
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression as LR
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import plot_roc_curve
###patsy是一个用于描述统计模型(尤其是线性模型或具有线性组件的模型)和建构设计矩阵的库
###kappa系数用于一致性检验,也可以用于衡量分类精度,代表分类与完全随机的分类产生错误减少的比例

cardata=pd.read_csv('car.csv')

cardata.shape

pd.options.display.max_columns=10
#####设置展示数据的最大列数位50
cardata.head()
######数据信息###################
cardata.info()
cardata.describe()

pd.crosstab(cardata.gender,cardata.clm)
pd.crosstab(cardata.gender,cardata.clm,normalize='index')
pd.crosstab(cardata.agecat,cardata.clm,normalize='index')
####pd.crossbat()是Pandas中的交叉表和透视功能。交叉表试用于计算一列数据对于另一个数据的分组个数

###########训练集和测试集###############
cardata['clm']=cardata['clm'].map(str)
cardata['veh_age']=cardata['veh_age'].map(str)
cardata['agecat']=cardata['agecat'].map(str)
##map(函数名,可迭代序列)函数根据提供的函数对指定的序列作映射返回集合,且不改变原list

output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 67856 entries, 0 to 67855
Data columns (total 10 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   veh_value  67856 non-null  float64
 1   exposure   67856 non-null  float64
 2   clm        67856 non-null  int64  
 3   numclaims  67856 non-null  int64  
 4   claimcst0  67856 non-null  float64
 5   veh_body   67856 non-null  object 
 6   veh_age    67856 non-null  int64  
 7   gender     67856 non-null  object 
 8   area       67856 non-null  object 
 9   agecat     67856 non-null  int64  
dtypes: float64(3), int64(4), object(3)
memory usage: 5.2+ MB
#####训练集和测试集################
traindata,testdata=train_test_split(cardata,test_size=0.3,stratify=cardata.clm,
random_state=0)

######哑变量处理################
y_train,x_train=dmatrices('clm~veh_value+veh_body+veh_age+gender+area+agecat',
data=traindata,return_type='dataframe')
###dmatrices接受公式字符串和数据集,为线性模型创建设计矩阵

pd.options.display.max_columns=30
x_train.head()
y_train.head()
y_train=y_train.iloc[:,1]
y_train.head()

y_test,x_test=dmatrices('clm~veh_value+veh_body+veh_age+gender+agecat',
data=testdata,return_type='dataframe')

y_test=y_test.iloc[:,1]

model=sm.Logit(y_train,X_train)
results=model.fit()
results.params
np.exp(results.params)
results.summary()
##哑变量指的是数据中的文本数据,哑变量处理就是将文本数据转换为线性不相关矩阵的过程

#训练集上训练指标########################
table=results.pred_table()
table#####训练集上混淆矩阵

Accuracy=(table[0,0]+table[1,1])/np.sum(table)
Accuracy

Error_rate=1-Accuracy
Error_rate

Sensitivity=table[1,1]/(table[1,0]+table[1,1])
Sensitivity

Specificity=table[0,0]/(table[0,0]+table[0,1])
Specificity

Recall=table[1,1]/(table[0,1]+table[1,1])
Recall

output:
[[44262.     0.]
 [ 3237.     0.]]
0.9318511968673024
0.06814880313269756
0.0
1.0
nan
############测试集误差####################
prob=results.predict(x_test)
pred=(prob=0.1)
table=pd.crosstab(y_test,pred,colnames=['Predicted'])
table

table=np.array(table)##########数据类型转换

Accuracy=(table[0,0]+table[1,1])/np.sum(table)
Accuracy

Error_rate=1-Accuraacy
Error_rate

Sensitivity=table[1,1]/(table[1,0]+table[1,1])
Sensitivity

Specificity=table[0,0]/(table[0,0]+table[0,1])
Specificity

Recall=table[1,1]/(table[0,1]+table[1,1])
Recall
###########
model=LR(C=1e10,class_weight='balanced',random_state=0)
#model=LR(C=1e10,class_weight={0:0.1,1:0.1},random_state=0)
model.fit(x_train,y_train)

model.coef_
results.params

model.score(x_test,y_test)

prob=model.predict_proba(x_test)
prob[:,5]

pred=model.predict(x_test)
#pred=(pro[:,1]>=0.3)
pred[:,5]

confusion_matrix(y_test,pred)
##混淆矩阵又称为误差矩阵,用于衡量分类算法的准确程度

 

#####
table=pd.crosstab(y_test,pred,rownames=['Acutal'],colnames=['Predicted'])
table

table=np.array(table)##########数据类型转换

Accuracy=(table[0,0]+table[1,1])/np.sum(table)
Accuracy

Error_rate=1-Accuraacy
Error_rate

Sensitivity=table[1,1]/(table[1,0]+table[1,1])
Sensitivity

Specificity=table[0,0]/(table[0,0]+table[0,1])
Specificity

Recall=table[1,1]/(table[0,1]+table[1,1])
Recall

######ROC AUC#################
plot_roc_curve(model,X_test,y_test)
x=np.linspace(0,1,100)
plt.plot(x,x,'k--',linewidth=1)
plt.title('ROC Curve(Test Set)')
cohen_kappa_score(y_test,pred)
##kappa系数的计算是通过把所有真实分类中的像元总数(N)乘混淆矩阵对角线(Xkk)的和,减去某一类地表真实像元总数逾该类中被分类像元总数之积对所有类别求和的结果

本文为个人学习总结,方方面面多有不妥还望批评指正

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本案例将使用逻辑回归模型来预测居民的出行方式选择行为。数据集包含居民的个人和家庭信息以及出行方式的选择情况。我们将使用Python语言进行分析建模。 首先,加载需要用到的库和数据集: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline data = pd.read_csv('modechoice.csv') ``` 接下来,我们对数据集进行探索和预处理: ```python # 查看数据集的前5行 data.head() # 将数据集分为自变量和因变量 X = data.iloc[:, :-1] y = data.iloc[:, -1] # 将分类变量转换为数值型变量 X = pd.get_dummies(X, columns=['Gender', 'Education', 'Income', 'Car', 'Bike']) # 将因变量转换为0和1的二元变量 y = np.where(y=='Car', 1, 0) # 将数据集分为训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 然后,我们使用逻辑回归算法进行建模: ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) ``` 接下来,我们评估模型的性能: ```python # 预测测试集的结果 y_pred = model.predict(X_test) # 计算模型的准确率 from sklearn.metrics import accuracy_score accuracy_score(y_test, y_pred) ``` 最后,我们可以使用模型来进行预测: ```python # 创建一个新的数据集 new_data = pd.DataFrame({ 'Gender_Female': [1], 'Gender_Male': [0], 'Education_Graduate': [0], 'Education_High School': [1], 'Education_Others': [0], 'Income_High': [1], 'Income_Low': [0], 'Income_Medium': [0], 'Car_No': [1], 'Car_Yes': [0], 'Bike_No': [0], 'Bike_Yes': [1] }) # 预测新数据的结果 model.predict(new_data) ``` 本案例中使用的数据集是一个虚构的例子,实际应用中需要根据具体的场景选择合适的数据集和特征工程方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值