机器学习 scikit-learn 特征预处理
归一化
对不同数据进行统一标准处理,但受到异常点的影响比较大
from sklearn.preprocessing import MinMaxScaler
def mm():
"""归一化"""
# feature_range 取值范围
mm = MinMaxScaler(feature_range=(2, 3))
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
标准化
在已有样本足够多的情况下,比较稳定,适合现代嘈杂大数据场景
from sklearn.preprocessing import StandardScaler
def standard():
"""标准化"""
std = StandardScaler()
data = std.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
'''
[[ 1.22474487 -1.22474487 -1.29777137 -1.3970014 ]
[-1.22474487 1.22474487 1.13554995 0.50800051]
[ 0. 0. 0.16222142 0.88900089]]
'''
缺失值
删除
如果每列或者每行数据缺失值达到一定的比例,建议放弃整行或者整列
插补
可以通过缺失值每行或者每列的平均值或者中位数来补充
from sklearn.preprocessing import Imputer
import numpy as np
def imputer_value():
"""缺失值处理"""
source_data = [[1, 2], [np.nan, 7], [5, 6]]
# 平均值 axis 0 列 1 行
im = Imputer(missing_values='NaN', strategy='mean', axis=0)
data = im.fit_transform(source_data)
print(data)
"""
[[1. 2.]
[3. 7.]
[5. 6.]]
"""
数据降维
特征选择
- 过滤式
from sklearn.feature_selection import VarianceThreshold
def var():
"""
特征选择-删除低方差的特征
"""
# 删除方差为0的数据
var = VarianceThreshold(threshold=0)
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
"""
[[2 0]
[1 4]
[1 1]]
"""
- 嵌入式
主成分分析
数据维数压缩,尽可能降低原数据维数(复杂度),损失少量信息,可以削减回归分析或者聚类分析中特征的数量。
- 特征降维
def pca():
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
print(data)
"""
[[ 1.22879107e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
"""
demo 学生选课分析
def pca_demo():
course = pd.read_csv("./data/course.csv", encoding='gbk')
s_and_c = pd.read_csv("./data/s_and_c.csv", encoding='gbk')
student = pd.read_csv("./data/student.csv", encoding='gbk')
merge_c = pd.merge(course, s_and_c, on=["course_id", "course_id"])
merge_s_c = pd.merge(merge_c, student, on=["student_id", "student_id"])
print(merge_s_c.head(100))
# 创建一个交叉表
cross = pd.crosstab(merge_s_c['student_name'], merge_s_c['course_name'])
print("=" * 50)
print(cross)
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data)
print(data.shape)
'''
course_id course_name student_id student_name
0 1 语文 1 张三
1 5 历史 1 张三
2 2 数学 3 王五
3 6 物理 3 王五
4 2 数学 4 刘二
5 4 政治 4 刘二
6 3 英语 2 李四
7 7 化学 2 李四
==================================================
course_name 化学 历史 政治 数学 物理 英语 语文
student_name
刘二 0 0 1 1 0 0 0
张三 0 1 0 0 0 0 1
李四 1 0 0 0 0 1 0
王五 0 0 0 1 1 0 0
[[-7.90569415e-01 -9.02761677e-17 7.07106781e-01]
[ 7.90569415e-01 1.00000000e+00 -2.46880764e-16]
[ 7.90569415e-01 -1.00000000e+00 1.41770466e-16]
[-7.90569415e-01 -5.75702907e-16 -7.07106781e-01]]
(4, 3)
'''