From 35bc0e5326d663f3292826bc1aa0fd6698812c82 Mon Sep 17 00:00:00 2001
From: Administrator <ssw1313113@gmail.com>
Date: Thu, 30 Jan 2025 20:58:00 -0600
Subject: [PATCH] make up comments for day01

---
 Code/Day 1_Data_Preprocessing.md | 86 +++++++++++++++++++++++++++++---
 1 file changed, 79 insertions(+), 7 deletions(-)

diff --git a/Code/Day 1_Data_Preprocessing.md b/Code/Day 1_Data_Preprocessing.md
index a6b1e20..9a091db 100644
--- a/Code/Day 1_Data_Preprocessing.md	
+++ b/Code/Day 1_Data_Preprocessing.md	
@@ -15,11 +15,15 @@ import pandas as pd
 ```
 ## 第2步:导入数据集
 ```python
-//随后一列是label
-dataset = pd.read_csv('Data.csv')//读取csv文件
-X = dataset.iloc[ : , :-1].values//.iloc[行,列]
-Y = dataset.iloc[ : , 3].values  // : 全部行 or 列;[a]第a行 or 列
-                                 // [a,b,c]第 a,b,c 行 or 列
+#最后一列是label
+dataset = pd.read_csv('Data.csv') #这行代码使用`pandas`的`read_csv`函数读取名为`Data.csv`的CSV文件,并将其内容加载到一个名为`dataset`的DataFrame对象中。DataFrame是`pandas`库中用于处理表格数据的主要数据结构。
+X = dataset.iloc[ : , :-1].values #这行代码使用`iloc`方法从`dataset`中提取所有行(`:`表示所有行)和除最后一列之外的所有列(`:-1`表示从第一列到倒数第二列)。`.values`将提取的数据转换为NumPy数组。这个数组通常被称为特征矩阵(`X`),用于机器学习中的输入特征。
+Y = dataset.iloc[ : , 3].values  #这行代码使用`iloc`方法从`dataset`中提取所有行(`:`表示所有行)和第4列(索引为3,因为Python的索引从0开始)。`.values`将提取的数据转换为NumPy数组。这个数组通常被称为目标变量(`Y`),用于机器学习中的输出或标签。
+
+#总结:
+# `X` 是特征矩阵,包含输入数据的所有特征(除最后一列)。
+# `Y` 是目标变量,包含输出数据(通常是最后一列)。
+# 而这段代码通常用于数据预处理阶段,为后续的机器学习模型训练准备数据。
 ```
 ## 第3步:处理丢失数据
 ```python
@@ -27,11 +31,36 @@ from sklearn.preprocessing import Imputer
 imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
 imputer = imputer.fit(X[ : , 1:3])
 X[ : , 1:3] = imputer.transform(X[ : , 1:3])
+
+#--------------分割线--------------
+# 当使用的Python3.13, pip无法安装sklearn.preprocessing, 报错原因是该包已过时
+# 解决方案是 pip install scikit-learn
+# 如果安装新版本(>0.20), Imputer 在 scikit-learn 中被移除,替代方案是 SimpleImputer,
+# 那么改造后的代码如下
+
+
+
+from sklearn.impute import SimpleImputer
+
+# 创建 SimpleImputer 实例,使用均值填充 NaN(Not a Number, 也就是缺失的数据)
+imputer = SimpleImputer(missing_values=np.nan, strategy="mean")
+
+# 只对数值列(1:3,即第2列和第3列)进行填充
+X[:, 1:3] = imputer.fit_transform(X[:, 1:3])
 ```
 ## 第4步:解析分类数据
 ```python
+# 使用scikit-learn库中的LabelEncoder和OneHotEncoder来进行数据预处理
 from sklearn.preprocessing import LabelEncoder, OneHotEncoder
+
+# 创建一个LabelEncoder对象,命名为labelencoder_X。LabelEncoder用于将分类数据(通常是字符串或类别)转换为数值形式。
 labelencoder_X = LabelEncoder()
+
+# 这行代码对特征矩阵X的第一列(索引为0)进行编码。具体来说:
+#
+# X[ : , 0] 表示X的所有行和第一列。
+# labelencoder_X.fit_transform(X[ : , 0]) 对第一列的数据进行拟合(fit)和转换(transform),
+# 将分类数据转换为数值形式。例如,如果第一列包含类别['A', 'B', 'C'],LabelEncoder可能会将其转换为[0, 1, 2]。
 X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
 ```
 ### 创建虚拟变量
@@ -40,17 +69,60 @@ onehotencoder = OneHotEncoder(categorical_features = [0])
 X = onehotencoder.fit_transform(X).toarray()
 labelencoder_Y = LabelEncoder()
 Y =  labelencoder_Y.fit_transform(Y)
+
+#--------------------分割线---------------
+#  IDE 提示 Unexpected argument,是因为 OneHotEncoder 的 categorical_features 参数
+#  已被移除(从 scikit-learn 0.22+ 开始被废弃)。更建议以下写法
+from sklearn.compose import ColumnTransformer
+column_transformer = ColumnTransformer(
+    transformers=[("encoder", OneHotEncoder(), [0])],  # 对第 0 列(Country)进行 OneHot 编码
+    remainder='passthrough'  # 其他列保持不变
+)
+# column_transformer:这是一个 ColumnTransformer 对象(假设在之前的代码中已经定义),用于对数据集中的不同列应用不同的预处理步骤(例如标准化、独热编码等)。
+# fit_transform(X):fit_transform 方法会先拟合(fit)数据,然后对数据进行转换(transform)。它会根据 column_transformer 中定义的预处理步骤对 X 进行处理。
+# np.array(...):将转换后的结果转换为 NumPy 数组。column_transformer.fit_transform(X) 返回的结果可能是一个稀疏矩阵或 DataFrame,这里将其显式转换为 NumPy 数组以便后续使用。
+# 总结:这行代码的作用是对特征矩阵 X 进行预处理(如标准化、独热编码等),并将结果转换为 NumPy 数组。
+X = np.array(column_transformer.fit_transform(X))
+
+# LabelEncoder():创建一个 LabelEncoder 对象,命名为 labelencoder_Y。LabelEncoder 用于将分类数据(通常是字符串或类别)转换为数值形式。
+# 总结:这行代码的作用是初始化一个 LabelEncoder 对象,用于对目标变量 Y 进行编码。
+labelencoder_Y = LabelEncoder()
+
+#fit_transform(Y):fit_transform 方法会先拟合(fit)目标变量 Y,然后对其进行转换(transform)。LabelEncoder 会将 Y 中的分类数据(如字符串标签)转换为数值形式。例如,如果 Y 包含类别 ['Yes', 'No', 'Yes'],LabelEncoder 可能会将其转换为 [1, 0, 1]。
+Y =  labelencoder_Y.fit_transform(Y)
 ```
 ## 第5步:拆分数据集为训练集合和测试集合
 ```python
-#from sklearn.model_selection import train_test_split
-from sklearn.cross_validation import train_test_split
+#from sklearn.model_selection import train_test_split #新版
+from sklearn.cross_validation import train_test_split #旧版
+
+#使用 scikit-learn 库中的 train_test_split 函数,用于将数据集划分为训练集和测试集。
+# 参数说明:
+# X:特征矩阵(输入数据),通常是 NumPy 数组或 DataFrame。
+# Y:目标变量(输出数据或标签),通常是 NumPy 数组或 Series。
+# test_size=0.2:指定测试集的比例。这里设置为 0.2,表示将 20% 的数据划分为测试集,剩下的 80% 作为训练集。
+# random_state=0:设置随机种子,确保每次运行代码时数据集的划分结果一致。如果不设置 random_state,每次运行代码时划分结果可能会不同。
+# 返回值:
+# X_train:训练集的特征矩阵。
+# X_test:测试集的特征矩阵。
+# Y_train:训练集的目标变量。
+# Y_test:测试集的目标变量。
+# 作用:
+# 这行代码的作用是将数据集 X 和 Y 划分为训练集和测试集,以便后续的模型训练和评估。
+# 训练集(X_train 和 Y_train)用于训练机器学习模型。
+# 测试集(X_test 和 Y_test)用于评估模型的性能,确保模型在未见过的数据上也能表现良好。
+# 总结:
+# train_test_split 是机器学习中常用的数据划分工具,用于将数据集划分为训练集和测试集。
+# 这行代码将数据集划分为 80% 的训练集和 20% 的测试集,并确保划分结果可重复(通过 random_state=0)。
 X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
 ```
 ## 第6步:特征量化
 ```python
 from sklearn.preprocessing import StandardScaler
+#StandardScaler 用于对数据进行标准化处理,即将数据转换为均值为 0、标准差为 1 的分布。
 sc_X = StandardScaler()
+# fit_transform 方法会先拟合(fit)训练集 X_train,计算其均值和标准差,然后对 X_train 进行标准化转换(transform)。标准化后的数据将具有均值为 0、标准差为 1 的特性。
 X_train = sc_X.fit_transform(X_train)
+# 使用训练集计算出的均值和标准差对测试集 X_test 进行标准化转换。注意,这里只调用 transform 而不是 fit_transform,因为测试集的标准化应该使用训练集的参数(均值和标准差),以确保数据分布一致。
 X_test = sc_X.transform(X_test)
 ```