备注:刷视频记录一下,以防知识点遗忘。
数据的特征预处理
单个特征
(1)归一化
引入:避免某一个特征对最终结果造成更大影响,为了不造成干扰。
例如:数据含有多个特征,但是某个特征的数据非常大,导致了其他特征的数据可以忽略不计,但是我又不想看到这样的情况,所以引入归一化。例如:下面里程数的数值非常大,如果不处理直接*权重,会导致结果误差较大:
归一化的计算公式:
说白了就是某列的某个数据x,在最大最小区间中的占比,再缩放到指定的区间,默认0-1。
归一化存在的问题:由公式我们不难发现,最大最小值受异常点的影响非常大,这种方法鲁棒性(反应产品稳定性)较差,只适合传统精确小数据场景(少)。例如下图:红色为异常点。
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return: None
"""
mm = MinMaxScaler(feature_range=(2, 3))
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
将特征值缩放到(2,3)之间,处理后的数据如下图:
(3)标准化
引入:对于标准化出现异常点,影响最大最小值,结果将发生该变。但是少量异常点对平均值影响并不大,方差改变较小。
标准化计算公式:
备注一下:方差用来衡量数据的稳定性。数据分散:方差大。数据集中:方差小。
标准化处理后的结果:将原始数据转换到均值为0,方差为1 的范围。
总结:异常数据标准化更好一点,通常使用的是标准化。
from sklearn.preprocessing import StandardScaler
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
#构造为二维数组
data = std.fit_transform([[1,-1,3], [2,4,2], [4,6,-1]])
print(data)
return None
(3)缺失值
这里除了使用sklearn 的Imputer的方法,还可以使用的是pandas对数进行处理。
from sklearn.preprocessing import Imputer
def im():
"""
缺失值处理
:return:None
"""
#NaN nan 0是列,1是行
im = Imputer(missing_values='NaN', strategy='mean', axis = 0)
data = im.fit_transform([[1,2],[np.nan, 3],[7, 6]])
print(data)
return None
多个特征
降维
实际就是减少一些特征的数量
降维的方法:特征选择,主成分分析:PCA,神经网络。
1)特征选择--删除低方差特征。
原因:当方差为0的时候,这一列特征的数据都一样,不能当做分析的特征。指定方差为0 的都出删除。
from sklearn.feature_selection import VarianceThreshold
def var():
"""
他正选择-删除低方差的特征
:return:
"""
var = VarianceThreshold(threshold=1.0)
data = var.fit_transform([[0,2,0,3], [0,1,4,3], [0,1,1,3]])
print(data)
return None
下面输出删除方差小于1后的结果,结果显示如下:
2)主成分分析进行降维(PCA)
核心:把你的维度降低,里面的数据没有损耗很多
特征数量达到上百个,考虑使用。
from sklearn.decomposition import PCA
def pca():
"""
主成分分析进行降维
:return: None
"""
#n_components:小数,0~1 90%
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2, 8, 4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None
处理后的结果如下: