一、缺失值处理
- 删除属性或者删除样本:如果大部分样本该属性都缺失买这个属性能提供的信息有限,可以选择放弃使用该维属性
- 统计填充:对于缺失值没有歧视数值类型的属性,根据所有样本关于这维属性的统计值对其进行填充,如使用平均数,中位数,众数,最大值,最小值,具体选择哪种统计值需要具体问题具体分析
- 统一填充:常用统一填充值有:“空”,“0”,“正无穷”,“负无穷”等
- 预测/模型 填充:可以通过预测模型利用不存在缺失值的属性来预测缺失值,也就是先用预测模型把数据填充后再做进一步的工作,如统计,学习等。虽然这种方法比较复杂,但是最后得到的结果比较好
pandas中用fillna,sklearn中用imputer
pandas
df_train['Age'].fillna(value=df_train['Age'].mean())
sklearn
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN',strategy='mean',axis=0)
age = imp.fit_transform(df_train[['Age']].values)
年收入: 商品推荐场景下填充平均值
行为时间点:填充众数
价格:商品匹配场景下填充平均值
人体寿命:人口估计场景下填充平均值
驾龄: 没有填写这项的用户可能没有车,为它填充为0比较合理
本科毕业时间:没有填写这一项的用户可能没有上大学,为它填写正无穷比较合理
婚姻状态:没有填写这一项的用户可能对自己隐私比较敏感,应单独设为一个分类,如已婚1,未婚0,未填-1
二 数值型特征
apply+numpy
log_age =df_train['Age'].apply(lambda x:np.log(x)) 把x转成了np.log(x)
df_train.loc[:,'log_age'] = log_age
preprocessing scaler
from sklearn.preprocessing import MinMaxScaler
mm_scaler =MinMaxScaler()
fare_trans = mm_scaler.fit_transform(df_train[['Fare']])
from sklearn.preprocessing import StandardScaler
std_scaler = StandardScaler()
fare_std_trans = std_scaler.fit_transform(df_train[['Fare']])
高次特征与交叉特征
- preprocessing.PolynaominFeatures
将两个特征组成一个特征
from sklearn.preprocessing import PolynomialFeatures
ploy = PolynomialFeatures(degree=2)
df_train[['sibsp','Parch']].head()
poly_fea = poly.fit_transform(df_train[['sibsp','Parch']])
对于数值型的特征中:特征的属性是无序的,用独热编码、哑变量 比如说:性别,颜色,星期
对于数值型的特征中:特征的属性是有序,用标签编码,比如说:公司的成立时间,职位:
三、性能度量与评估方法
准确性:分类正确样本占用样本个数的比例。其中Ncorrect就是被分类正确的样本的个数
准确率:Accuracy=(15+(80-35))/100 = 60%
精确率:分类正确的正样本个数占分类器判断定为正样本的个数的比例。其中Nringt+表示分类正确的正样本的数量,Ncorrect+表示所有被为正样本的数量
召回率:分类正确的正样本占真实正样本的比例,其中Night+表示分类正确的正样本的数量,Nreally+表示真实正样本的数量。
F1_score:是精确率和召回率的调和平均值
调和平均值:
from sklearn.metrics import accuracy_score
from sklearn.metrcis import recall_sorce
from sklearn.metrcis import f1_socre
y_pred = [0,1,2,3]
y_true = [0,1,2,3]
print(accuracy_score(y_true,y_pred))
print(precision_socre(y_true,y_pred,average='macro'))
print(recall_score(y_true,y_pred,averager='macro'))
prtin(f1_score(y_true,y_pred,average='macro'))
四、编码方式
- 类类型: OneHot encoding/独热向量编码
pandas get_dunmmies
OneHotEncoder() - 一些属性是类别性而不是数值型,举一个简单的例子,由{红,绿,蓝}组成的颜色属性,最常用的方式是把方式把每个类型属性转换成二元属性,即从{0,1}中取一个值,因此基本上增加的属性等于相应的数目的类别,并且对于你数据集中每个实例只有一个是1(其他的为0),这就是独热编码方式
embarked_oht = pd.get_dummies(df_train[['Embarked']])
五、总结
1 那些机器学习算法不需要做归一化(Normalization)处理?
概率模型不需要归一化,因为她们不关心变量的值,因为她们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树,随机森林,随机森林rf。而像adaboost,svm,kr,knn,kmeans之类的最优化问题就需要归一化。
2 对于树形接口为什么不需要归一化
数值缩放,不影响分裂点的位置.因为第一步是按照特征值进行排序,排序的顺序不变,那么所属的分支以及分裂点就不会有不同,对于线性模型,比如LR,一个是(0,1),一个是(0,10000)的,这样运用梯度下降的时候,损失等高线是一个椭圆的形状,这样我想迭代到最优点,就需要很多迭代。但是如果进行了归一化,那么等高线就是圆形的,那么SGD就会往远点进行迭代,需要迭代的次数比较少。另外注意树模型是不能进行梯度下降,因为树模型是阶跃的,阶跃点是不可导的,并且求导没有意义,并且求导没有意义,所以树模型虚招最优点是通过虚招最优分裂点完成,从而不需要数据的归一化
3 处理不平衡数据
权重法是比较简单的方法,我们可以对训练集的每个类别加一个权重calss weight。如果该类别的样本数多,那么他的权重就低,反之则权重就搞。如果更细致点,我们还可以对每个权重sample weight,思路和类被权重一样,即样本数多的类别样本权重低,反之样本权重高
采样法常用的也有两种思路,一种是类别样本数多的样本做子采样,比如训练集A类别样本占90%,B样本占样本10%。那么我们可以对A类的样本子采样,知道子采样得到A类样本和B类别现有样本一致为止,这样我们就只用子采样的得到的A类样本数和B类样本数现有样本一起做训练集拟合模型,第二种思路对类别样本数少的样本做过采样,还是上面的例子,我们对B类别的样本做过采样,直到过采样得到的B类别样本数加上B类别原来样本一起和A类样本数一致
4 异常特征样本清洗
我们在实际项目中拿到的数据往往有不少异常数据,有时候不筛选出这些异常数据很可能让我们后面的数据分析模型很大的偏差。那么如果我们没有专业知识,如何筛选这些异常特征样本?常用的方法有两种
- 第一种是聚类,比如我们可以用Kmeans聚类将训练样本分成若干个族,如果某一个族里的样本数很少,而且族质心和其他素有的族都很远,那么这个族里面的样本很
多有可能是异常特征样本我们就可以将其从训练集过滤掉
- 第二种是异常检测方法,主要是使用iForest或者One class SVM,使用异常点加测的机器学习算法来过滤所以的异常点
当然,某些筛选出来的异常样本师范真的是不需要的异常特征样本,最好懂业务的再确认一下防止我们将政策的样本过滤掉