用于分类的机器学习¶
——用于解决分类问题的逻辑回归-客户流失预测
- 下载数据集,并且进行数据处理,保持一致性
- 把数据分为训练、验证、测试三部分
- 确定重要特征
- 将分类变量转化为数值变量
- 训练逻辑回归模型
(一)探索性数据分析¶
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则越无影响。
- 互信息:衡量**分类变量**与目标变量之间的依赖程度——相关OR独立。信息论
- 相关系数:就高中学的,也称皮尔逊相关系数
风险率-分组操作¶
.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]