跳转至

用于分类的机器学习

——用于解决分类问题的逻辑回归-客户流失预测

  1. 下载数据集,并且进行数据处理,保持一致性
  2. 把数据分为训练、验证、测试三部分
  3. 确定重要特征
  4. 将分类变量转化为数值变量
  5. 训练逻辑回归模型

(一)探索性数据分析

1 pandas类型判错错误

"TotalCharges"是object类型,需要转化为float64类型。造成这样结果的原因很可能是:该列存在需要额外预处理的缺失值的特殊编码

pd.to_numeric(arg,errors,downcast)

强制变为数值型,若遇非数值类型,则通过errors='coerce'跳过这些情况,这样Pandas将用NaN替换所有非数字类型:total_charges = pd.to_numeric(df.TotalCharges, errors='coerce')

  • arg: 要转换的数据,可以是单个值、列表、Series 或 DataFrame。
  • errors: 用于处理错误的策略,有三个选项:
  • 'raise'(默认):如果有无法转换的值,则引发错误。
  • 'coerce':将无法转换的值设置为 NaN(缺失值)。
  • 'ignore':保留无法转换的值,不做任何更改。
  • downcast: 选择将数据类型向下转换的方式,通常用于节省内存。选项包括 'integer''signed''unsigned''float'

确认包含非数值字符:df[total_charges.isnull()][['customerID', 'TotalCharges']] #左边先来一个布尔索引筛出空值,再通过[]取列——>确实存在缺失值

2 拆分训练集和验证集

train_test_split() 是 scikit-learn 库中的一个函数,用于将数据集分割为训练集和测试集。这个函数是机器学习项目中非常常用的工具,因为它帮助你将数据集分成两个部分:一个用于训练模型,另一个用于测试模型的性能。这样可以确保模型的评估是基于未见过的数据,从而获得更可靠的性能指标。

from sklearn.model_selection import train_test_split
# 假设 X 是特征数据,y 是目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • X: 特征数据(通常是一个二维数组或 DataFrame)。
  • y: 目标变量(通常是一维数组或 Series)。
  • test_size: 测试集的比例或数量。可以是一个浮点数(表示比例)或一个整数(表示具体的测试样本数量)。例如,test_size=0.2 表示将 20% 的数据用作测试集,test_size=100 表示测试集包含 100 个样本。
  • train_size: 训练集的比例或数量。可以省略,train_size 会根据 test_size 自动计算。
  • random_state: 随机种子,用于保证结果的可重复性。设置相同的种子会得到相同的训练集和测试集分割。如果不设置或设置为 None,每次运行时数据分割可能会不同。
  • shuffle: 是否在分割前打乱数据。默认为 True,表示会打乱数据。设置为 False 时,则不会打乱数据,分割将按原始顺序进行。
  • stratify: 用于指定分层抽样的变量。可以是目标变量 y,这样可以确保训练集和测试集中目标变量的比例与整体数据集一致。通常用于分类问题,以确保各类别的分布一致。

3 分类变量有多少个唯一值

df_train_full[categorical].nunique()

4 特征重要性分析

  1. 流失率:比较分组流失率和总体流失率
  2. 风险率:风险 = 分组率/总体率。接近于1则越无影响。
  3. 互信息:衡量**分类变量**与目标变量之间的依赖程度——相关OR独立。信息论
  4. 相关系数:就高中学的,也称皮尔逊相关系数
风险率-分组操作

.groupby()

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, dropna=True)
  • by: 用于分组的列或列名,可以是一个字符串或一个列表。
  • axis: 按行或按列分组,默认是按行(axis=0)。
  • level: 如果有层级索引,可以指定分组的级别。
  • as_index: 是否将分组列设置为结果的索引,默认是 True
  • sort: 是否对分组结果进行排序,默认是 True
  • group_keys: 是否将分组键添加到结果的索引中,默认是 True
  • dropna: 是否丢弃包含 NaN 值的组,默认是 True.agg()
DataFrame.agg(func=None, axis=0, *args, **kwargs)
  • func: 聚合函数或函数列表。例如,可以是 'mean''sum' 或一个自定义函数。
  • axis: 指定对行或列应用聚合函数,默认是对列(axis=0)。
  • args: 传递给函数的其他位置参数。
  • kwargs: 传递给函数的其他关键字参数。
互信息
from sklearn.metrics import mutual_info_score
def calculate_mi(series): # 计算互信息的独立函数
    return mutual_info_score(series, df_train_full.churn)
df_mi = df_train_full[categorical].apply(calculate_mi) # 计算“分类列”的互信息
df_mi = df_mi.sort_values(ascending=False).to_frame(name='MI') #对结果进行排序
df_mi

apply(): pandas DataFrame 的一个方法,用于将指定的函数应用到 DataFrame 的每一列或每一行。apply() 可以用来处理数据,计算统计量,或进行其他转换。 .sort_values(ascending=False):对series进行降序排序 .to_frame(name='MI'):转化为DataFrame并取列名为MI

(二)特征工程

——直接套函数啦

# DataFrame.to_dict(orient='records', into=)
  • orient: 指定转换字典的格式。'records' 是其中一种选项,表示每一行将被转换为一个字典,每个字典的键是列名,对应的值是该行的值。
  • into: 这是一个可选参数,指定返回的字典的类型,默认为 dict
# DictVectorizer
from sklearn.feature_extraction import DictVectorizer
dv = Dicvectorizer(sparse=False)
dv.fit(train_dict)
X_train = dv.transform(train_dict)

创建**Dicvectorizer实例**,调用**fit方法**训练,创建==非稀疏==矩阵,用**transform方法**将字典转化为矩阵

(三)分类

老朋友sigmoid()函数啦

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='liblinear', random_state = 1)
model.fit(X_train, y_train)

val_dict = df_val[categorical + numerical].to_dict(orient='records')
X_val = dv.transform(val_dict)
y_pred = model.predict_proba(X_val)[:,1]