Predicción de primas de seguros médicos con Machine Learning
Utilizando Python
Python
Seguros
Random Forest Regressor
Author
Juan Isaula
Published
November 19, 2023
Una persona que ha contratado una póliza de seguro médico obtiene cobertura de seguro médico pagando una prima determinada. Existen muchos factores que determinan la prima del seguro médico. Entonces, si deseas saber como podemos utilizar Machine Learning para predecir la prima del seguro médico, este artículo es para ti. En este artículo, lo guiaré a traves de la tarea de predicción de primas de seguros médicos con Machine Learning usando Python.
Predicción de primas de seguro médico
El monto de la prima de una póliza de seguro médico depende de persona a persona, ya que muchos factores afectan el monto de la prima de una póliza de seguro médico. Por ejemplo, la edad, una personas joven tiene menos probabilidad de tener problemas de salud importantes en comparación con una persona mayor. Por tanto, tratar a una persona mayor será caro en comparación con una joven. Por este motivo, una persona mayor debe pagar una prima más elevada que una persona joven.
Además de la edad, muchos otros factores afectan la prima de una póliza de seguro médico. A este punto, espero haya comprendido qué es el seguro médico y cómo se determina la prima de una poliza de seguro médico. En la siguiente sección, lo guiaré a través de la tarea de predicción de primas de seguros médicos con aprendizaje automático utilizando Python.
Predicción de primas de seguros médicos usando Python
El conjunto de datos que estoy utilizando para la tarea de predicción de primas de seguros médicos se recopila de Kaggle. Contiene datos sobre:
age: la edad de la persona.
sex: género de la persona.
bmi: índice de masa corporal de la persona.
children: cuantos hijos va a tener la persona.
smoker: si la persona fuma o no.
region: la región donde vive la persona.
charges: cargos de la prima de segura.
Entonces, importemos el conjunto de datos y las bibliotecas de Python necesarias para esta tarea:
import numpy as npimport pandas as pddata = pd.read_csv("health_insurance_charges.csv")data.head()
age
sex
bmi
smoker
region
children
charges
0
21
male
25.745000
no
northeast
2
3279.868550
1
37
female
25.744165
yes
southeast
3
21454.494239
2
18
male
30.030000
no
southeast
1
1720.353700
3
37
male
30.676891
no
northeast
3
6801.437542
4
58
male
32.010000
no
southeast
1
11946.625900
Antes de continuar, echemos un vistazo a si este conjunto de datos contiene valores nulos o no:
data.isnull().sum()
age 0
sex 0
bmi 0
smoker 0
region 0
children 0
charges 0
dtype: int64
Por lo tanto, el conjunto de datos está listo para ser utilizado. Después de tener las primeras impresiones de estos datos, me fijé en la columna smoker, que indica si la persona fuma o no. Esta es una característica importante de este conjunto de datos porque una persona que fuma tiene más probabilidades de tener problemas de salud importantes en comparación con una persona que no fuma. Así que veamos la distribución de personas que fuman y que no:
import plotly.express as pxdata = datafigure = px.histogram(data, x ="sex", color ="smoker", title="Number of Smokers")figure.show()
Según la visualización anterior, 1,144 hombres y 980 mujeres no fuman y 243 hombres y 133 mujeres fuman. Es importante utilizar esta función al entrenar un modelo de Machine Learning, por lo que ahora reemplazaré los valores de las columnas sex y smoker con 0 y 1, ya que ambas columnas contienen valores de cadena:
Ahora echemos un vistazo a la correlación entre las características de este conjunto de datos:
print(data.corr())
age sex bmi smoker children charges
age 1.000000 -0.151066 0.146278 0.032529 -0.055408 0.312068
sex -0.151066 1.000000 -0.005126 0.077443 0.146442 0.089900
bmi 0.146278 -0.005126 1.000000 0.028656 -0.034233 0.197721
smoker 0.032529 0.077443 0.028656 1.000000 -0.174135 0.769390
children -0.055408 0.146442 -0.034233 -0.174135 1.000000 -0.064515
charges 0.312068 0.089900 0.197721 0.769390 -0.064515 1.000000
C:\Users\juani\AppData\Local\Temp\ipykernel_18556\3359323643.py:1: FutureWarning:
The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.
Modelo de predicción de primas de seguro médico
Pasemos ahora a entrenar un modelo de aprendizaje automático para la tarea de predecir las primas de seguros médicos. Primero, dividiré los datos en conjuntos de entrenamiento y prueba:
x = np.array(data[["age", "sex", "bmi", "smoker"]])y = np.array(data["charges"])from sklearn.model_selection import train_test_splitxtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=42)
Después de usar diferentes algoritmos de Machine Learning, encontré que el algoritmo de Random Forest es el de mejor rendimiento para esta tarea. Entonces aquí entrenaré el modelo usando el algoritmo de Random Forest Regression:
from sklearn.ensemble import RandomForestRegressorforest = RandomForestRegressor()forest.fit(xtrain, ytrain)
RandomForestRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
RandomForestRegressor()
Ahora echemos un vistazo a los valores predichos del modelo:
ypred = forest.predict(xtest)data = pd.DataFrame(data={"Monto de prima predicho": ypred})print(data.head())
Monto de prima predicho
0 9406.796792
1 4375.500954
2 41854.323503
3 15823.019738
4 6563.550778
Así es como se puede entrenar un modelo de Machine Learning para la tarea de predicción de primas de seguros médicos utilizando Python.
Resumen
El monto de la prima de una póliza de seguro médico depende de persona a persona, ya que muchos factores afectan el monto de la prima de una póliza de seguro médico. Espero que te haya gustado este artículo sobre predicción de primas de seguros médicos con Machine Learning utilizando Python. No dude en hacer sus valiosas preguntas en la sección de comentarios a continuación.