【Python使用】嘿马python数据分析教程第6篇:Wrapper【附代码文档】
🏆🏆🏆教程全知识点简介:1.Excel使用与全渠道业务分析包括groupby操作、不同类别App价格分布。2. Pandas基础涵盖列表与整数间运算、imdb_score列操作(加法、乘法、取余、比较操作)、通用函数加法实现。3. DataFrame基本操作包括skipna聚合行为、内存占用查看与优化(astype转换、类别化处理)。4. 数据分析入门涵盖数据类型查看、内存优化、对象列独立值统计、分类处理。5. 选取数据子集与布尔索引包括movie数据集读取、条件构造。6. 分组聚合、过滤与转换涉及航班数据排序、列重命名、城市间航班统计、NumPy sort提速、DataFrame构造对比。7. 数据追加与修改包含loc操作、字典赋值、append方式、性能测试。8. SQL数据读取涵盖SQLAlchemy引擎创建、read_sql_table、read_sql_query使用、歌曲时长统计、顾客消费统计。9. 时间序列分析包括hdf5文件读取、crime数据集处理、DatetimeIndex操作、时间切片、按时间与类别分组、内存优化、多层索引选择。10. 可视化涉及Matplotlib、Pandas、Seaborn绘图、航班延迟图表、时间分布图、机场统计图、散点图、距离分组、缺失值插补。11. 特征与目标变量提取、模型初始化与拟合。
📚📚👉👉👉 https://gitee.com/yinuo112/Backend/blob/master/Python/嘿马python数据分析教程/note.md
🎯🎯🎯全教程总目录
🚀🚀🚀本篇主要内容
Wrapper
递归特征消除 (Recursive Feature Elimination)
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。
对特征含有权重的预测模型(例如,线性模型对应参数coefficients),RFE通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。
RFECV 通过交叉验证的方式执行RFE,以此来选择最佳数量的特征:对于一个数量为d的feature的集合,他的所有的子集的个数是2的d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的。通过该算法计算所有子集的validation error。选择error最小的那个子集作为所挑选的特征。
In [29]:
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
rf = RandomForestClassifier()
iris=load_iris()
X,y=iris.data,iris.target
rfe = RFE(estimator=rf, n_features_to_select=3)
X_rfe = rfe.fit_transform(X,y)
X_rfe.shape
Out[29]:
(150, 3)
In [30]:
X_rfe[:5,:]
Out[30]:
array([[5.1, 1.4, 0.2],
[4.9, 1.4, 0.2],
[4.7, 1.3, 0.2],
[4.6, 1.5, 0.2],
[5. , 1.4, 0.2]])
In [ ]:
#### Embedded
使用SelectFromModel选择特征 (Feature selection using SelectFromModel)
基于L1的特征选择 (L1-based feature selection)
使用L1范数作为惩罚项的线性模型(Linear models)会得到稀疏解:大部分特征对应的系数为0。当你希望减少特征的维度以用于其它分类器时,可以通过 feature_selection.SelectFromModel 来选择不为0的系数。
特别指出,常用于此目的的稀疏预测模型有 linear_model.Lasso(回归), linear_model.LogisticRegression 和 svm.LinearSVC(分类)
In [31]:
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X,y)
model = SelectFromModel(lsvc, prefit=True)
X_embed = model.transform(X)
X_embed.shape
Out[31]:
(150, 3)
In [32]:
X_embed[:5,:]
Out[32]:
array([[5.1, 3.5, 1.4],
[4.9, 3. , 1.4],
[4.7, 3.2, 1.3],
[4.6, 3.1, 1.5],
[5. , 3.6, 1.4]])
工作中的套路
模型上线后可能会遇到的问题:
- 模型效果不好
- 训练集效果好,跨时间测试效果不好
- 跨时间测试效果也好,上线之后效果不好
- 上线之后效果还好,几周之后分数分布开始下滑
- 一两个月内都比较稳定,突然分数分布骤降
- 没有明显问题,但模型每个月逐步失效
考虑一下业务所需要的变量是什么。
- 变量必须对模型有贡献,也就是说必须能对客群加以区分
- 逻辑回归要求变量之间线性无关
- 逻辑回归评分卡也希望变量呈现单调趋势 (有一部分也是业务原因,但从模型角度来看,单调变量未必一定比有转折的变量好)
- 客群在每个变量上的分布稳定,分布迁移无可避免,但不能波动太大
从上述方法中找到最贴合当前使用场景的几种方法。
In [29]:
import pandas as pd
import numpy as np
df_train = pd.read_csv('train.csv')
df_train.head()
Out[29]:
PassengerId | label | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
1)变量重要性
[aiofiles 文档]
- 卡方检验
- 模型筛选
2)共线性
- 相关系数 COR
在做很多基于空间划分思想的模型的时候,我们必须关注变量之间的相关性。单独看两个变量的时候我们会使用皮尔逊相关系数。
In [6]:
df_train.corr()
[json 文档]
Out[6]:
PassengerId | label | Pclass | Age | SibSp | Parch | Fare | |
---|---|---|---|---|---|---|---|
PassengerId | 1.000000 | -0.005007 | -0.035144 | 0.036847 | -0.057527 | -0.001652 | 0.012658 |
label | -0.005007 | 1.000000 | -0.338481 | -0.077221 | -0.035322 | 0.081629 | 0.257307 |
Pclass | -0.035144 | -0.338481 | 1.000000 | -0.369226 | 0.083081 | 0.018443 | -0.549500 |
Age | 0.036847 | -0.077221 | -0.369226 | 1.000000 | -0.308247 | -0.189119 | 0.096067 |
SibSp | -0.057527 | -0.035322 | 0.083081 | -0.308247 | 1.000000 | 0.414838 | 0.159651 |
Parch | -0.001652 | 0.081629 | 0.018443 | -0.189119 | 0.414838 | 1.000000 | 0.216225 |
Fare | 0.012658 | 0.257307 | -0.549500 | 0.096067 | 0.159651 | 0.216225 | 1.000000 |
3)单调性
- bivar图
[sys 文档]
[Python 语言参考]
# 等频切分
df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'], 10)
df_train.head()
df_train = df_train.sort_values('Fare')
alist = list(set(df_train['fare_qcut']))
badrate = {}
for x in alist:
a = df_train[df_train.fare_qcut == x]
bad = a[a.label == 1]['label'].count()
good = a[a.label == 0]['label'].count()
badrate[x] = bad/(bad+good)
f = zip(badrate.keys(),badrate.values())
f = sorted(f,key = lambda x : x[1],reverse = True )
badrate = pd.DataFrame(f)
badrate.columns = pd.Series(['cut','badrate'])
badrate = badrate.sort_values('cut')
print(badrate)
badrate.plot('cut','badrate')
cut badrate
9 (-0.001, 7.55] 0.141304
6 (7.55, 7.854] 0.298851
8 (7.854, 8.05] 0.179245
7 (8.05, 10.5] 0.230769
3 (10.5, 14.454] 0.428571
4 (14.454, 21.679] 0.420455
2 (21.679, 27.0] 0.516854
5 (27.0, 39.688] 0.373626
1 (39.688, 77.958] 0.528090
0 (77.958, 512.329] 0.758621
[python-dateutil 文档]
[Bottle 文档]
Out:
[fabric 文档]
<matplotlib.axes._subplots.AxesSubplot at 0x168263d8cf8>
- 点赞
- 收藏
- 关注作者
评论(0)