一、学习知识点摘要
1、数据预处理
2、异常值处理
3、数据分箱
4、特征交互
5、特征编码
6、特征选择
二、学习内容
(一)、数据预处理
1、缺失值的填充
对于缺失值的填充往往会影响比赛的结果,在比赛中不妨尝试多种填充然后比较结果,选择最优的一种。(清洗一些异常值往往会获得意想不到的效果)
• 把所有缺失值替换为指定的值0
data_train = data_train.fillna(0)
• 纵向用缺失值上面的值替换缺失值
data_train = data_train.fillna(axis=0,method='bfill',limit=2)
• 纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值
data_train = data_train.fillna(axis=0,method='bfill',limit=2)
• 按照中位数填充数值型特征(median中位数)
data_train[numerical_fea] = data_train[numerical_fea].fillna(data_train[numerical_fea]).median())
• 按照众数填充类别型特征(mode众数)
data_train[category_fea] = data_train[category_fea].fillna(data_train[category_fea].mode)
2、时间格式处理
'issueDate'为时间格式特征
• 转化为时间格式
3、对象类型特征转换到数值
• 部分类型特征
像等级这种类别特征,是有优先级的可以LabelEncode或者自映射
(二)、异常值处理
当你发现异常值后,一定要先分清是什么原因导致的异常值,然后再考虑如何处理。首先,如果这一异常值并不代表一种规律性的,而是极其偶然的现象,或者说你并不想研究这种偶然的现象,这时可以将其删除。其次,如果异常值存在且代表了一种真实存在的现象,那就不能随便删除。在现有的欺诈场景中很多时候欺诈数据本身相对于正常数据勒说就是异常的,我们要把这些异常点纳入,重新拟合模型,研究其规律。能用监督的用监督模型,不能用的还可以考虑用异常检测的算法来做。
1、检测异常的方法一:均方差(3segama原则)
在统计学中,如果一个数据分布近似正态,那么大约68%的数据值会在均值的一个标准差范围内,大约95%会在两个标准差范围内,大约99.7%会在三个标准差范围内。
得到特征异常值后可以进一步分析变量异常值和目标变量的关系。
2、检测异常的方法二:箱型图
四分位数会将数据分为三个点和四个区间,IQR=Q3-Q1,下触须=Q1-1.5*IQR,上触须=Q3+1.5*IQR
(三)、数据分箱
基本原则:最小分箱占比不低于5%
箱内不能全部都是好客户
连续箱单调
1、固定宽度分箱
2、分位数分箱
3、卡方分箱
(四)、特征交互
1、特征与特征之间的结合
2、特征与特征之间的衍生
3、其他特征衍生的尝试
(五)、特征编码
1、one-hot编码
2、label-encode编码
(六)、特征选择
1、Filter
2、Wrapper(RFE)
3、Embedded
三、学习的问题与解答
Q1:to_datetime()函数是什么意义及用法?
A1:def to_datetime(arg,errors='raise',utc=None,format=None,unit=True) 将给定的数据按照指定的格式转换成日期格式
arg:输入
errors:有三种取值'ignore','raise','coerce',默认为raise。'raise'则无效的解析将引发异常,'coerce'则无效解析将被设为NaT,'ignore'则无效的解析将返回输入值
utc:布尔值,默认为None,返回utc即协调世界时
format:格式化显示时间的格式
unit:默认值为‘ns’,则将会精确到微秒,'s'为秒
ps:答案来源:
Q2:strptime()函数是什么意义和用法?
A2: datetime.strptime(date_string,format) 将一个日期字符转成datetime日期格式便于后期处理
data_string:是要转成日期的字符串
format:转换后的日期格式
%a | 星期几名称的简写 |
%A | 星期几名称的全称 |
%b | 月份名称的简写 |
%B | 月份名称的全称 |
%c | 首选的日期和时间表示法 |
%C | 表示世纪的数字(年份除以100,范围从00-99) |
%d | 一个月中的第几天(01-31) |
%D | 时间格式,与%m/%d/%y表示法相同 |
%e | 一个月中的第几天(1-31) |
%g | 与%G表示法类似,但不带世纪 |
%G | 与ISO星期数对应的四位数年份(见%V) |
%h | 与%b表示法相同 |
%H | 小时,使用24小时制(00到23) |
%I | 小时,使用12小时制(01-12) |
%j | 一年中的第几天(001-366) |
%m | 月份(01-12) |
%M | 分 |
%n | 换行符 |
%p | 与给定的时间值相对应的am或pm |
%r | am和pm的时间标记法 |
%R | 24小时制的时间标记法 |
%S | 秒 |
%t | tab制表符 |
%T | 当前时间,与%H:%M:%S表示法相同 |
%u | 星期几的数字表示(1-7),Monday[星期一]=1。警告:在SunSolaris系统中,Sunday[星期天]=1 |
%U | 当年包含的周数,从第一个星期日开始,作为第一周的第一天 |
%V | 当年包含的ISO 8601 格式下的周数(01-53),week1表示当年的第一周,至少要有四天,且以星期一作为周的第一天 |
%W | 当年包含的周数,从第一个星期一开始,作为第一周的第一天 |
%w | 以十进制数形式表示一周中的某天,Sunday[星期天]=0 |
%x | 首选的日期表示法,不带时间 |
%X | 首选的时间表示法,不带日期 |
%y | 不包含表示世纪的数字的年份表示(范围00-99) |
%Y | 包含表示世纪的数字的年份表示法 |
%Z或%z | 时区名称或简写 |
%% | 输出一个%字符 |
Q3:sort_index()函数是什么意义和用法?
A3:DataFrame.sort_index(axis=0,by=None,ascending=True) 针对某一参数进行排序,在使用sort_index和DataFrame进行排序时,不能直接对index和columns都含有的字段进行排序,会报错
by:针对某一列进行排序(不能对行使用by参数)
Series.sort_index(ascending=True) 可以对index进行排序
ascending:控制升序或降序,默认为升序
ps:答案来源
四、学习的思考与总结
1、经过前面几天的学习,对于python和机器学习的知识已经掌握了一点皮毛,大致清楚了应该从哪几个方面去认识一个新的函数。
2、前面的函数积累让我能够看懂越来越多的代码,这是个挺不错的进步呢
3、但是总体学习进度还是偏慢,跟不上打卡的进度,加油吧!学习人!