- 删除特征: data = data.drop(['region', 'sex'], axis=1)
- 特征数据调整: data.apply( )
-
# 体重指数,离散化转换,体重两种情况:标准、肥胖
-
def
convert(
df,bmi):
-
df[
'bmi'] =
'fat'
if df[
'bmi'] >= bmi
else
'standard'
-
return df
-
data = data.apply(convert, axis =
1, args=(
30,))
# args 是传参
- 将非数字类型特征转换为数值: data = pd.get_dummies(data)
- 设定目标值和特征值:
-
X = data.drop(
'charges', axis=
1)
# 训练数据
-
y = data[
'charges']
# 目标值
中国人寿保费项目
数据存储: https://blog.csdn.net/March_A/article/details/128985290
1. 导入数据
-
import numpy
as np
-
import pandas
as pd
-
data = pd.read_excel(
'./中国人寿.xlsx')
-
data.head(
10)
2. 查看数据特征
-
import seaborn
as sns
-
# 性别对保费影响
-
sns.kdeplot(data[
'charges'],shade =
True,hue = data[
'sex'])
-
-
# 地区对保费影响
-
sns.kdeplot(data[
'charges'],shade =
True,hue = data[
'region'])
-
-
# 吸烟对保费影响
-
sns.kdeplot(data[
'charges'],shade =
True,hue = data[
'smoker'])
-
-
# 孩子数量对保费影响
-
sns.kdeplot(data[
'charges'],shade =
True,hue = data[
'children'],palette=
'Set1')
-
不同性别对保费影响不大,不同性别的保费的概率分布曲线基本重合,因此这个特征无足轻重,可以删除, 地区同理
-
吸烟与否对保费的概率分布曲线差别很大,整体来说不吸烟更加健康,那么保费就低,这个特征很重要
-
家庭孩子数量对保费有一定影响
3. 删除不重要数据
data = data.drop(['region', 'sex'], axis=1)
4 特征属性调整
-
# 体重指数,离散化转换,体重两种情况:标准、肥胖
-
def
convert(
df,bmi):
-
df[
'bmi'] =
'fat'
if df[
'bmi'] >= bmi
else
'standard'
-
return df
-
data = data.apply(convert, axis =
1, args=(
30,))
# args 是传参
-
data.head()
5 非数值转换为数据类型 (去字符串)
-
# 特征提取,离散型数据转换为数值型数据
-
data = pd.get_dummies(data)
-
data.head()
6 设定目标值和特征值
-
# 特征和目标值抽取
-
X = data.drop(
'charges', axis=
1)
# 训练数据
-
y = data[
'charges']
# 目标值
-
X.head()
7 数据拆分
-
# 数据拆分
-
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)
8 数据升维
-
# 特征升维
-
from sklearn.preprocessing
import PolynomialFeatures
-
poly = PolynomialFeatures(degree=
2, include_bias =
False)
-
X_train_poly = poly.fit_transform(X_train)
-
X_test_poly = poly.fit_transform(X_test)
9 模型训练
-
# 模型训练
-
from sklearn.linear_model
import LinearRegression
-
model_1 = LinearRegression()
-
model_1.fit(X_train_poly, y_train)
-
-
# 使用弹性网络训练
-
from sklearn.linear_model
import ElasticNet
-
model_2 = ElasticNet(alpha =
0.3,l1_ratio =
0.5,max_iter =
50000)
-
model_2.fit(X_train_poly,y_train)
10 模型评估
-
model_1.score(X_train_poly, y_train)
# 0.8624083431844988
-
model_2.score(X_test_poly, model_2.predict(X_test_poly))
# 1.0
-
# 模型评估
-
from sklearn.metrics
import mean_squared_error,mean_squared_log_error
-
print(
'训练数据均方误差:',
-
np.sqrt(mean_squared_error(y_train,model_1.predict(X_train_poly))))
-
print(
'测试数据均方误差:',
-
np.sqrt(mean_squared_error(y_test,model_1.predict(X_test_poly))))
-
-
print(
'训练数据对数误差:',
-
np.sqrt(mean_squared_log_error(y_train,model_1.predict(X_train_poly))))
-
print(
'测试数据对数误差:',
-
np.sqrt(mean_squared_log_error(y_test,model_1.predict(X_test_poly))))
结论:
-
进行EDA数据探索,可以查看无关紧要特征
-
进行特征工程:删除无用特征、特征离散化、特征提取。这对机器学习都至关重要
-
对于简单的数据(特征比较少)进行线性回归,一般需要进行特征升维
-
选择不同的算法,进行训练和评估,从中筛选优秀算法
转载:https://blog.csdn.net/March_A/article/details/128985172
查看评论