【笔记】数据分析实战:从数据清洗到ROC曲线

一、导入数据并查看

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

adults_df = pd.read_csv('data/adults.txt')

(1)查看基本信息和描述性统计信息

adults_df.head()
adults_df.info()
adults_df.describe().T
# 空值监测(平均数是0则无空值)
adults_df.isnull().mean()

获取到的信息如下:

在这里插入图片描述

在这里插入图片描述

变量名含义类型
age年龄数值型
workclass工作类型类别型
final_weight编号数值型
education受教育程度类别型
education_num受教育时间数值型
marital_status婚姻状况类别型
occupation职位类别型
relationship家庭关系类别型
race种族类别型
sex性别类别型
capital_gain资本收益数值型
capital_loss资本损失数值型
hours_per_week每周工作小时数值型
native_country原籍类别型
salary工资类别型(>50K和<50K)

总结:本数据集无空值。后续处理:final_weight列、education列、martial_status列和relationship列舍弃,numeric数据类型要排除异常值,object数据类型在经过适当合并和排除后要映射成数字或转化成哑变量矩阵。

(2)绘图查看分布信息

# 特征提取
features = ['age', 'workclass', 'education_num', 'occupation', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_per_week', 'native_country', 'salary']
train = adults_df[features].copy()

# 观察字段分布
def show_data_counts(df):
    for col_name in df:
        col_data = df[col_name]
        sns.countplot(col_data) if col_data.dtype == 'object' else sns.distplot(col_data)
        plt.xticks(rotation=40)
        plt.show()

# 调用函数
show_data_counts(train)

结果略,达到的效果是确定了各个特征中哪些样本比较少的类别在之后可以合并。


二、数据处理


2.1 object数据的处理

(1)处理workclass字段(后续步骤同(1))

① 查看

# 查看
train['workclass'].value_counts()
"""
Private             22696
Self-emp-not-inc     2541
Local-gov            2093
?                    1836
State-gov            1298
Self-emp-inc         1116
Federal-gov           960
Without-pay            14
Never-worked            7
Name: workclass, dtype: int64
"""

② 思路

两种self-emp合并;三种gov合并;without-pay和never-worked合并;?删除。

③ 执行

# 执行
workclass_dict = {
    'Self-emp-not-inc': 'Self-emp',
    'Self-emp-inc': 'Self-emp',
    'Local-gov': 'Gov',
    'State-gov': 'Gov',
    'Federal-gov': 'Gov',
    'Without-pay': 'Free',
    'Never-worked': 'Free',
    '?': np.nan
}

train['workclass'] = train['workclass'].map(lambda x: workclass_dict.get(x, x))
train.dropna(inplace=True)

④ 检查

# 检查
sns.countplot(train['workclass'])

在这里插入图片描述

(2)处理occupation字段

# 查看
train['occupation'].value_counts()

# 执行
occupation_dict = {
    'Other-service': 'Service',
    'Protective-serv': 'Service',
    'Priv-house-serv': 'Service',
    '?': np.nan
}

train['occupation'] = train['occupation'].map(lambda x: occupation_dict.get(x, x))
train.dropna(inplace=True)

# 检查
sns.countplot(train['occupation'])
plt.xticks(rotation=90)
plt.show()

在这里插入图片描述

(3)处理race字段

# 查看
train['race'].value_counts()

# 执行
race_dict = {
    'White': 'White'
}

train['race'] = train['race'].map(lambda x: race_dict.get(x, 'Other'))

# 检查
sns.countplot(train['race'])
plt.show()

在这里插入图片描述

(4)处理native_country字段

# 查看
train['native_country'].value_counts()

# 执行
native_country_dict = {
    'United-States': 'United-States',
    '?': np.nan
}

train['native_country'] = train['native_country'].map(lambda x: native_country_dict.get(x, 'Other'))
train.dropna(inplace=True)

# 检查
sns.countplot(train['native_country'])
plt.show()

在这里插入图片描述


2.2 numeric数据的处理

from sklearn.preprocessing import StandardScaler

# 得到待处理字段列表
con_list = train.describe().columns

# 标准化处理
def to_standard(df, col_list):
    for col_name in col_list:
        df[col_name] = StandardScaler().fit_transform(df[[col_name]])

to_standard(train, con_list)

# 查看(结果略)
show_data_counts(train[con_list])

# 剔除异常值(z-score判定法)
train = train[(np.abs(train[con_list]) <= 3).all(axis=1)]

2.3 汇总

# 创建哑变量矩阵
obj_list = ['workclass', 'occupation', 'race', 'sex', 'native_country']
obj_df = pd.concat([pd.get_dummies(train[col_name]) for col_name in obj_list], axis=1)

# 哑变量矩阵和object数据拼接
X = pd.concat([obj_df, train[con_list.tolist()]], axis=1)

# 拿到标签
y = train['salary'].copy()

# 查看
X.shape  # (27920, 27)
y.shape  # (27920,)

三、网格搜索

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, train_test_split

# 实例化对象(以逻辑斯蒂回归为例)
lr = LogisticRegression()

# 设置需要网格搜索的参数
params = {
    'penalty': ['l1', 'l2'],
    'C': [0.1, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0],
    'max_iter': [30, 50, 70, 100],
    'solver': ['lfgbs', 'sag', 'liblinear', 'newton-cg', 'saga']
}

# 创建网格搜索对象
gscv = GridSearchCV(lr, params)

# 训练
gscv.fit(X, y)

# 查看最优参数
gscv.best_params_ 
# {'C': 1.5, 'max_iter': 30, 'penalty': 'l1', 'solver': 'saga'}

四、ROC曲线绘制

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 使用最佳参数重新创建实例化对象
lr = LogisticRegression(C=1.5, max_iter=30, penalty='l1', solver='saga')

# 训练
lr.fit(X_train, y_train)

# 打分
lr.score(X_test, y_test)

from sklearn import metrics

# 计算f1_score
metrics.f1_score(y_test, lr.predict(X_test), pos_label='<=50K')

# 得到每个测试集样本<=50K的概率
proba_scores = lr.predict_proba(X_test)[:,0:1]

# 定义一个绘图函数
def show_roc(y_test, scores, pos_label):
    # 得到FPR、TPR和阈值
    fpr, tpr, threshold = metrics.roc_curve(y_test, scores, pos_label=pos_label)
    plt.plot(fpr, tpr, color='green')
    # 绘制对角线
    plt.plot(np.linspace(0,1,10),np.linspace(0,1,10),color='red',ls='--') 
    # 加X轴Y轴标签
    plt.xlabel('FPR')
    plt.ylabel('TPR')
    # 加名字
    plt.title('ROC space')
    plt.show()

# 调用函数
show_roc(y_test, proba_scores, '<=50K')

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sprite.Nym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值