数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
5.1、数据清洗
5.1.1 数据样本抽样
· 样本要具有代表性
· 样本比例要平衡以及样本不均衡时如何处理
· 考虑全量数据
5.1.2异常值(空值)处理
· 识别异常值和重复值
Pandas:isnull()/duplicated()----判断是否有重复的项
· 直接丢弃(包括重复数据)
Pandas:drop()/dropna()/drop_duplicated()
· 把异常当作一个新的属性,替代原值
Pandas:fillna()
· 集中值指代
Pandas:fillna()
· 边界值指代
Pandas:fillna()
· 插值
Pandas:interpolate() --- 针对于Series
若插入值是位于首部,则插入第二个数的数值大小;
若插入值是位于尾部,则插入倒数第二个数的数值大小;
若插入值位于中部,则取前后两数的平均值;
import numpy as np import pandas as pd df = pd.DataFrame({'A':['a0','a1','a1','a2','a3','a4'], 'B':['b0','b1','b2','b2','b3',None], 'C':[1,2,None,3,4,5], 'D':[0.1,10.2,11.4,8.9,9.1,12], 'E':[10,19,32,25,8,None], 'F':['f0','f1','g2','f3','f4','f5']}) print(df) # print(df.duplicated()) #删除空值所在行 # df = df.dropna() #删除某一属性的空值 df = df.dropna(subset=['B']) #删除重复数所在的行,保留第一个(默认),last为保留最后一个 df = df.drop_duplicates('A',keep='first') df['B'] = df.fillna('b*') #插值只能对Series进行处理 df['E'] = df['E'].interpolate() upper_q = df['D'].quantile(q=0.75) lower_q = df['D'].quantile(q=0.25) k = 1.5 q_int = upper_q - lower_q df = df[df['D'] < upper_q + k * q_int][df["D"] > lower_q - k * q_int] # print(pd.Series([1,None,9,16,25]).interpolate()) print(df) #要求F列必须以f开头 df[[True if item.startswith('f') else False for item in list(df['F'].values)]] print(df)
'''
结果:
A B C D E F
1 a1 a1 2.0 10.2 19.0 f1
3 a2 a2 3.0 8.9 25.0 f3
4 a3 a3 4.0 9.1 8.0 f4
'''