1、赔率
2、PCA
引入PCA降维的原因是由于“维数灾难”,在机器学习中,过多的特征有时会使分类结果更差;或者是该特征是冗余特征。“维数灾难”是指计算量急剧增加,而分类精度下降。
PCA降维,就是将高维特征(n维)投影到低维子空间(k维),从而实现特征的融合。
1). 样本标准化
其中,
2). PCA降维
将n维数据降到k维,我们要选择最大的主成分。
-
首先计算协方差矩阵
-
其次求特征值特征向量,选择最大特征值对应的特征向量作为第一主成分,次大特征值对应的特征向量作为第二主成分…最终选出k组主成分,组成一个n*k维的特征向量矩阵。
-
将X投影到相应的k个主成分,融合形成K组新的特征。
这样,我们就得到了降维后的新的数据。
思考:为什么要求
X
T
X
X^TX
XTX的特征值、特征向量?即PCA推导过程
补充:特征选择和PCA特征降维的区别
特征选择是考察每一个特征 x j i x^{i}_j xji与样本类别标签 y i y^{i} yi的相似度,优先选择相似度大的留下。PCA是融合所有特征做了降维
数据清洗
独热编码(one-hot)
logistic回归将文本特征转为数值特征时需要
决策树和随机森林不需要
离散特征的编码分为两种情况:
-
离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
-
离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
会造成特征急剧膨胀
Python_PCA
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import matplotlib as mpl
from matplotlib.font_manager import FontProperties
font=FontProperties(fname=r'C:\Windows\Fonts\simsun.ttc',size=12)
"""1、读取鸢尾花数据"""
data = pd.read_csv('iris.data', header=None,
names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
print(data.head())
data['class'] = pd.Categorical(data['class']).codes # 将鸢尾花类别信息转换为数值信息
x = data.iloc[:, 0:4] # 特征
y = data['class'] # 标签
"""2、用PCA进行特征选择"""
# 它会返回组分方差大的2个组分
pca = PCA(n_components=2)
x = pca.fit_transform(x) # 返回降维后的新的特征(150,2)
print('2个成分各自的方差百分比', pca.explained_variance_ratio_)
print('2个组分各自的方差', pca.explained_variance_)
"""3、绘制降维后的新的数据"""
# 得到自己的colormap
color_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.scatter(x[:, 0], x[:, 1], s=20, c=y, cmap=color_dark)
plt.xlabel(u'组分1', fontproperties=font)
plt.ylabel(u'组分2', fontproperties=font)
plt.title(u'Iris Data PCA降维', fontproperties=font)
plt.show()
Python_one-hot
这里给出了pandas和sklearn两颗库的标签编码和独热编码的实现方式。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
"""读取数据"""
data = pd.read_csv(r'iris.data', header=None,
names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
print(data.head())
x = data.iloc[:, 0:4]
y = data['class']
"""one-hot编码"""
# pandas
y2 = pd.get_dummies(y)
print('pandas-one-hot',y2.head())
"""one-hot编码"""
# sklearn
y1=pd.Categorical(y).codes
# sparse = False 输出的是稀疏的存储格式,即索引加值的形式
one_hot=OneHotEncoder(sparse=False,categories='auto')
y1=one_hot.fit_transform(y1.reshape(-1, 1))
print('sklearn-one-hot',y1[:5])
"""Label Encoder"""
# pandas
y1=pd.Categorical(y).codes
# sklearn
l_enc=LabelEncoder()
y=l_enc.fit_transform(y)