对于每天的学习,大致可以划分为三个部分,第一个部分是我自己对代码的理解和注释,也就是源码。第二部分是提取出来的重点和思想。第三部分是补充扩展部分,如算法的核心思想,原作者的配图等等。
1.代码复现
# 导入库
import numpy as np
import pandas as pd
from importlib_metadata import passthrough
from pandas.core.common import random_state
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# 1.0 导入数据集
data = pd.read_csv('Data.csv')
# 2.0 数据集的展示
print(data.info()) ## 展示基本信息
print("********************")
print(data.head()) ## 展示前 5 行的信息
print("********************")
print(data.columns) ## 展示 列 的的信息
print("********************")
# 3.0 数据集列的映射,成中文
# 数据集变量名为 data
# 直接按照原有的列顺序,赋值新的中文列表
# data.columns = ['国家', '年龄', '薪水', '是否购买']
# 或者使用另外一种方法进行 rename
col_mapping = {
'Country': '国家',
'Age': '年龄',
'Salary': '薪水',
'Purchased': '是否购买' # 你的 label 列
}
# 加上 inplace=True 会直接在原数据集上修改,不需要重新赋值给 df
data.rename(columns=col_mapping, inplace=True)
# columns 这里需要接收一个 字典类型的 列名 ,inplace 表示是否原地更改,True 表示是,如果想要另存一个副本可以这样写
# data2 = data.rename(columns=col_mapping, inplace=False)
print(data.columns)
# 使用 Ctrl + P 或者使用 Ctrl + Q 进行查看函数的使用说明
# 4.0 提取特征
X = data.iloc[ : , : -1].values
# 这个理解为 逗号前面是 行 的取值范围,后面是列的取值范围,所以行的取值范围是 全部 这是一个左开右闭的区间,到 -1 表示到最后一列不取
# 【开始位置 : 结束位置】
# 加入 .values 这个里面表示把原来的 pandas 形式表示为 numpy 格式 进行变换
Y = data.iloc[ : , 3].values
# 这里取最后一列 第三列
# .iloc[行,列]
# : 全部行 or 列;[a]第a行 or 列
# [a,b,c]第 a,b,c 行 or 列
print("X")
print(X)
print("Y")
print(Y)
# 5.0 数据清洗
# 输入 SimpleImputer 按下 Alt + Enter 进行自动补全和导入包
# 查看缺失值的函数是 isnull()
# 在实战中 isnull() 这个函数只会显示有多少个 True 和 False ,一般情况下还可以加入一个 sum() 进行缺失值的求和
print("********************")
print(data.isnull().sum())
print("********************")
imputer = SimpleImputer(missing_values=np.nan , strategy = 'mean')
# 新版本的参数变得更加精简和强大。最常用的核心参数有 3 个:
# missing_values (寻找目标)
# 默认值: np.nan
# 作用: 告诉算法数据里的“坑”长什么样。大部分情况下保持默认 np.nan 即可
# strategy (填补策略 - 最核心!)
# 作用: 决定用什么数学逻辑来填补空缺。它有 4 个选项:
# "mean":平均值(默认项)。最常用,适用于正常的数值型数据。
# "median":中位数。适用于包含极端异常值(比如突然出现一个几百亿的薪水)的数值型数据,中位数不容易被带偏。
# "most_frequent":众数(出现频率最高的值)。这是处理文本分类数据(比如国家列里的“法国”、“德国”)的救星! 既可以用于数字,也可以用于文字。
# "constant":固定常量。直接用你指定的固定内容去把所有的坑填满。
# fill_value (固定填补内容)
# 作用: 只有当你的策略选了 strategy="constant" 时,这个参数才有用。
# 用法: 比如针对缺失的“国家”,你可以设置 strategy="constant", fill_value="未知国家"。这样所有的空缺都会统一填上“未知国家”这四个字。
imputer = imputer.fit(X[ : , 1:3])
# fit 只进行计算,对于 第一列和第二列的数据进行计算,并且暂存为 imputer 里面
# fit 还可以在分离特征的时候使用,划分数据集的时候使用 等等
# fit(X, y=None):计算规律
# X (必填):这是你要让机器去“摸底”的特征矩阵。
# 格式要求:它必须是一个 二维的数组或矩阵(也就是有行有列的数据,即使你只想处理一列,也要保持二维的格式)。在你之前的代码中,传入的 X[:, 1:3] 就是一个包含所有行、2列的二维特征矩阵。
# y (选填):目标标签。
# 为什么有这个参数:在后续你学习真正的预测模型(如决策树、逻辑回归)时,fit 是用来训练模型的,那时候你必须同时把特征 X 和答案 y 都传给它(比如 model.fit(X, y))。
# 在预处理(如填补缺失值)时:因为填补特征数据不需要知道最终结果,所以这里的 y 默认是 None。你只需要像代码里那样,传一个 X[:, 1:3] 给它就行了。
X[ : , 1:3] = imputer.transform(X[ : , 1:3])
# 2. transform(X):执行修改
# X (必填):这是你要“动刀子”修改的目标数据。
# 一旦 fit 记住了平均值,你就可以调用 transform(X)。这里的 X 就是需要被填补空缺的具体数据矩阵。
# 注意:transform 方法会返回一个新的矩阵(也就是填好坑的完整数据)。所以你必须用一个变量去接收它,否则填好的数据就直接丢失了。这也是为什么你的代码里写的是 X[:, 1:3] = imputer.transform(...)。
print("---------------------")
print("Step 3: 数据清洗部分")
print("step2")
print("X")
print(X)
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
# ColumnTransformer 这个函数是一个集成的管道函数,这个可以进行多种处理方式,
# 需要接受三个参数 第一个 字符串是这个工程的名称,返回到那个字符中
# 第二个是需要进行的工作函数,这里是独热编码
# 第三个是需要处理的 列 只能处理列,也可也进行多个列
# remainder 是剩下的列 这个可以取两个参数,第一个是 drop 不处理的列直接丢弃,这个 passthrough 是放行的意思,不处理
X = ct.fit_transform(X)
# 所以说ColumnTransformer(...)这个代码只是说明一下接下来这个ct 变量要进行什么操作,但是具体的操作是 fit_transform 来作用的
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
# 上述代码对于 label 标签进行 编码 默认参数传递就是空,下面是实际的操作
# 先定义机器,在传入数据是 sklearn 设计的一个特有哲学方法
print("---------------------")
print("Step 4: Encoding categorical data")
print("X")
print(X)
print("Y")
print(Y)
#Step 5: Splitting the datasets into training sets and Test sets
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
# 数据集的划分,这个就是正常饭划分方式,其中 text_size 就是划分范围,
# random_state = 0 or 固定数字 这个作为随机种子进行划分,这个表示打乱顺序的方法 是 0 和 固定数字 也是打乱的
# 如果你处理的是时间序列数据(比如股票价格、天气预报,昨天的天数必须排在今天前面),你才需要“不打乱顺序”。
# 这个时候,你需要明确修改默认的 shuffle 参数,将其设为 False:
print("---------------------")
print("Step 5: Splitting the datasets into training sets and Test sets")
print("X_train")
print(X_train)
print("X_test")
print(X_test)
print("Y_train")
print(Y_train)
print("Y_test")
print(Y_test)
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
# 特征缩放,依然是先定义机器,然后进行处理
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
# 所以说我可以这样理解,训练集需要找到规律,所以需要用到 fit 来计算均值,然后整个测试集不能计算他的均值,应该使用上述得到的均值得来计算,
# 从而进行测试对吗?如果测试集进行了 fit 那么就是知道答案来计算,计算的结果一定是拟合的,对吗?
# 如果我们在造出机器 sc_X = StandardScaler() 之后,不调用 fit,
# 直接对训练集调用 X_train = sc_X.transform(X_train),根据上面的伪代码逻辑,程序会发生什么现象?为什么?
# 上述你给我的问题,不用 fit 直接进行 transform 进行计算,那么规律就是垃圾值,所以裁剪的也是垃圾,没有一点作用,程序也会卡死,因为缺失规律
# 简单的说 fit 是计算参数 而 transform 是应用参数 ,针对测试集需要先计算参数 然后应用参数
# 而针对测试集需要 利用上述的参数来直接应用来看模型的效果2.总结思考
2.1 数据清洗流程
数据清洗流程可以分为以下几个部分
导入数据集
数据集展示
编码映射
目标特征的提取
数据集的划分
2.2 核心函数解析
导入数据集中使用 pandas 中的 pd.read_csv 进行导入
数据集展示是一种多维度,多方向的展示,例如
print(data.info()) ## 展示基本信息
print("********************")
print(data.head()) ## 展示前 5 行的信息
print("********************")
print(data.columns) ## 展示 列 的的信息
print("********************")还有很多类似的函数可以进行扩充
接下来就是变量名的映射,如何将英文变量名映射成中文,使用 rename 函数
rename 函数需要接收两个参数,第一个参数是 字典类型的一个列名 columns ,第二次参数 inplace 来确定是否保存另外的副本
True 表示 “原地修改” 不需要另存新的副本
# data.columns = ['国家', '年龄', '薪水', '是否购买']
# 或者使用另外一种方法进行 rename
col_mapping = {
'Country': '国家',
'Age': '年龄',
'Salary': '薪水',
'Purchased': '是否购买' # 你的 label 列
}
# 加上 inplace=True 会直接在原数据集上修改,不需要重新赋值给 df
data.rename(columns=col_mapping, inplace=True)
# columns 这里需要接收一个 字典类型的 列名 ,inplace 表示是否原地更改,True 表示是,如果想要另存一个副本可以这样写
# data2 = data.rename(columns=col_mapping, inplace=False)