特征预处理:
目的:方便我们下一步的处理。
数值类数据:缩放:归一化,标准化,缺失值处理
类别型数据:one-hot编码
时间类型:时间的切分
数值型数据之归一化
什么是归一化?
为了数据处理的方便和提取,把数据映射成0-1之间的数,更加方便。
归一化的公式:x1 = (x-mix)/(max-min) x2 = x1*(mx-mi) + mi
# 作用于每一列,max为一列的最大值,min为一列的最小值,mx,mi为指定区间值默认mx为1,mi为0
# x2 为最终结果。使用默认值x1就为最终结果。
什么时候用到归一化?
当某些特征同等重要的时候,但是数值差别很大,会进行归一化处理。
目的:来使之不受某一个特征的影响过大。
缺点:对于异常点比如有个点更大更小,便宜过大,会影响较大。
归一化实例:
# 归一化处理
# 导入归一化模块MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
def mm():
# 实例化
mm = MinMaxScaler()
data = mm.fit_transform([[123,222,2,54],[70,60,10,99],[65,40,30,23]])
print(data)
会输出:
[[1. 1. 0. 0.40789474]
[0.0862069 0.10989011 0.28571429 1. ]
[0. 0. 1. 0. ]]
如果想让他显示不在0-1之间,而是在2,5之间:
# 实例化修改成:
mm = MinMaxScaler(feature_range=(2,5))
# 根据数值的大小,对应生成某个区间对应值的大小。
数值型数据之标准化
由于归一化对异常值的处理不好,所以不常用
使用最广泛的就是标准化。标准化就是在归一化的基础上对异常值的处理较好。
特点:通过原始数据进行变换到均值为0,方差为1范围。
x = x-mean/标准差
# 作用于每一列,mean为平均值。标准差这里不好写,自己百度一下就好。
标准差实例:
# 导入标准差模块StandardScaler
from sklearn.preprocessing import MinMaxScaler,StandardScaler
# 标准差处理
def stand():
std = StandardScaler()
data = std.fit_transform([[123,222,2,54],[70,60,10,99],[65,40,30,23]])
print(data)
输出:
[[ 1.40992884 1.40709714 -1.01904933 -0.14956377]
[-0.60969896 -0.58083661 -0.33968311 1.29265832]
[-0.80022988 -0.82626053 1.35873244 -1.14309455]]
# 标准化常用于数据多且杂的情况下。
缺失值的处理
1、删除,整行或者整列的删除(数据来之不易,不建议)
2、填补,根据实际情况的不同,填充平均值,中位数等值(一般按照列来填充)
sklearn提供的填充模块:sklearn.preprocessing.Imputer
使用:imputer(missing_values="NaN",strategy="mean",axis=0)
missing_values:缺失值的位置
strategy:填充什么值,mean表示平均数
axis:更具0轴还是1轴填充值
实例:
# 导入模块
from sklearn.preprocessing import Imputer
import numpy as np
def Im():
im = imputer(missing_values="NaN",strategy="mean",axis=0)
data = im.fit_transform([[123,np.nan,2,54],[np.nan,60,10,99],[65,40,30,23]])
print(data)
输出:
[[123. 50. 2. 54.]
[ 94. 60. 10. 99.]
[ 65. 40. 30. 23.]]
数据的降维
降维:特征的数量(不是数组的维度)
比如有身高,体重,头发长度这三个特征,就是三维。
将三维变成二维就是降维处理。
为什么要降维?
有些不重要影响不大的数据我们可以选择不要。
降维的方式:
1、特征选择
2、主成分分析
特征选择:
如果特征过多,几千个特选不可能人为的选择。这里就要借助其他工具。
常用特征处理:
1、Fileter:过滤
# 对方差进行过滤,方差小的,说明数值相差不大,也就是特征大致相同,就选择过滤掉。
2、Embedded:嵌入式(正则化,决策树)后面讲
3、神经网络
特征选择实例:
def var():
# 数据
test = [[2,4,6],[3,4,8],[6,4,9]]
# threshold=0.0表示把一样的数据删除,默认也是删除方差为0的
v = VarianceThreshold(threshold=0.0)
data = v.fit_transform(test)
print(data)
# VarianceThreshold你可以自己修改,修改成1.0就删除方差小于1.0的数据。
主成分分析(PCA)
PCA:分析,简化数据集的技术
目的:对数据维度进行压缩,减少原数据的维度,损失的数据较少
应用场景:特征数量达到上百个就需要考虑一下了。
用低维度表示高纬度的东西但损失较少的数据,结合实际,最常见的就是画出的立体图。
公式:百度一下,有兴趣的也可以看一下推导式。
PCA实例:
# 导入模块
from sklearn.decomposition import PCA
def pca():
test = [[2,4,6],[3,4,8],[6,4,9]]
pca = PCA(n_components=0.99)
data = pca.fit_transform(test)
print(data)
输出:
[[-2.32318647 -0.39794495]
[-0.35170213 0.65716145]
[ 2.6748886 -0.25921649]]
# 变成了2个特征的。
# n_components参数可以是小数也可以是整数
# 小数表示要保存%之多少的数据
# 整数表示去掉多少数据
数据集的划分
拿到很多数据,不会将他全部用来训练模型。
把数据分为两部分:训练集和测试集
一般70%,30%,或75%,25%或80%,20%。
训练集就是帮助我们建立模型,而测试集就是评估模型。
sklearn给我们提供了划分数据的模块:sklearn.model_selection.train_test_split
同时sklearn也提供给了学习使用的数据:
skliearn.datasets模块
datasets.load_xxx():提供给我们小规模数据
datasets.fetch_xxx(data_home=None):大规模数据
# 这里xxx表示不同的数据集。
# data_home表示需要下载的路径
返回的数据都是datasets.base.Bunch类型(也就是字典格式)
属性:
data:获取特征数据数组,是一个多行多列的二维数组(类型为numpy.ndarray)
target:标签,一维数组(也就是目标值)
DESCR:数据描述
deature_names:特征名(有些数据集没有)
target_names:标签名
实例:
# 导入鸢尾花数据集(4个花的特征,3中类别,150个样本数据,每个类别数量50个)
from sklearn.datasets import load_iris
# 导入划分训练集和评估集模块
from sklearn.model_selection import train_test_split
def Iris():
# 获取到数据集
l = load_iris()
# 输出特征值
print(l.data)
# 输出目标值
print(l.target)
# 输出数据集详情(什么特征,什么类别等)
print(l.DESCR)
# 获取特征名
print(l.feature_names)
# 获取目标值名称
print(l.target_names)
# 划分数据集
# 返回数据的顺序为训练集的特征值,测试集的特征值,训练集的特征值,训练集的目标值,测试集的目标值
# 依次起名为:x_train,x_test,y_train,y_test(不能改变顺序)
# 第一个参数为数据,第二个参数为目标值,第三个为测试集大小。
x_train,x_test,y_train,y_test = train_test_split(l.data,l.target,test_size=0.25)
print("训练集数据和目标值:",x_train,y_train)
# 在sklearn还有其他数据,比如load_diabetes()是糖尿病数据集。
# 对于大数据集这里就不慌介绍了,下载速度比较慢。
转换器
回想特征工程的步骤.
1、实例化(转换器)
2、调用fit_transform()转化成数据集
其实在其中还有两个方法,fit()和transform(),很像把fit_transform拆分开了。
实际fit_transform() = fit()+ transform()
fit():输入数据,但是不做转化,但是他提前做了计算平均值等。
transform():进行数据的转化。
为什么拆开?
转换成数据集的时候是根据平均值,方差等等计算转化的。
但是如果我不想用这个数据集的平均值和方差来转化。想用其他的数据的平均值和方差来计算呢?
此时就需要拆开处理了。
比如:
标准化处理:
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
data1 = std.fit([[111,222,333],[444,555,666]])
data2 = std.transform([[11,22,33],[44,55,66]])
此时也就是用来data1中的平均值和方差等来转化data2中的数据。
估计器
估计器就是一些算法的实现。
分类算法:
sklearn.neighbors:k-近邻算法
sklearn.naive_bayes:贝叶斯算法
sklearn.linear_model.LogisticRegression:逻辑回归
sklearn.tree:决策树和随机森林
回归算法:
sklearn.linear_model.LinearRegression:线性回归
sklearn.linear_model.Ridge:岭回归