1. 前言
数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来,数据的质量、准确性和可用性成为决定项目成功与否的关键因素。
数据清洗提高数据质量,保证数据集的一致性;促进数据分析与挖掘,进一步提高模型质量与准确性,减少错误决策的风险。
2. 数据集的删补
2.1 数据集的删除操作
train_Data.drop('CapitalLoss',axis=1,inplace=True) #对于某一列进行操作
2.2 数据集的修改操作
train[0] #获取数据的第0列
train.iloc[0,1] #获取数据的第0行第1列
在DataFrame中默认索引是列,所以如列表一般[]是列索隐
想要获取数据库中某一特定数据使用loc或者iloc(行列索引),[行,列]
train_Data.iloc[0,1] = 3 #针对特定数据进行修改
与赋值一样,获取特定数据后可以直接赋新值进行替代。
train_Data[0].replace(2,3,inplace=True) #将第0行中为2的数据替换为3
train_Data.replace(' ?',pd.NaT,inplace=True) #数据集中为字符?替换为缺失值
也可以使用replace函数进行针对性替代。
2.3 数据集的增添操作
train_Data[6] = 7 #新增一列,这列数据为7
直接在原数据集中进行添加。
df1 = pd.DataFrame({'A':[1,2],'B':[2,3]})
df2 = pd.DataFrame({'A':[3,4],'B':[4,5]})
df3 = pd.concat([df1,df2],axis=0,ignore_index=True) #行对齐
df4 = pd.concat([df1,df2],axis=1) #列对齐
concat函数可以将多个表格进行拼接。
3. 规范化标签
3.1 自定义编码
• 最简单粗暴的方法,通过对每一列标签进行判断,逐个对标签进行数值化
Data['sex'][Data['sex'] == 'Male'] = 1
• 使用map函数
mapping = {'good':2,'normal':1,'bad':0}
data['class'] = data['class'].map(mapping)
通过map函数与字典的结合,将原数据集中的数据进行替换
• replace()方法
replace方法与map方法类似:
mapping = {'good':2,'normal':1,'bad':0}
data['class'] = data['class'].replace(mapping)
#对单个值替换
data['class'].replace('bad','worse') #将bad替换为worse
3.2 标签编码
sklearn库中也配备了编码包:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder() #初始化
le.fit_transform(train_Data) #对这一列数据进行标签数值化
对于调用的LabelEncoder模型我们需要将其初始化之后再使用。
for column in train_Data.columns: #遍历数据集的每一列
if train_Data[column].dtype = 'object':
train_Data[column] = le.fit_transform(train_Data[column])
通过循环的方式,将每一列标签中数值类型为object的标签进行数值化:
上述代码展示了将标签进行规范化,LabelEncoder将标签转化为从0-n的数值标签,互不重复。
但标签编码也有其局限性:
标签编码将分类数据转换为数字数据,但它为每个数据类别分配一个唯一的数字(从0开始)。这可能导致在数据集的模型训练期间产生优先级问题。具有高值的标签可以被认为具有比具有较低值的标签高的优先级。
查看原始类别以及对应的编码标签:
print(le.classes_)
print(list(range(Len(le.classes_)))) #根据出现顺序
3.2 独热编码
3.2.1 使用pandas库
df1 = pd.DataFrame({'Str':['A','A','B','B','C']})
df1.get_dummies(df1,columns=['Str'])
在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
通俗而言,独热编码将各属性平等化,每一个属性权重,优先级等都一样。
3.2.2 使用Sklearn库
data = pd.DataFrame({'Str':['A','B','A','C']})
form sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit(data) #将数据库data中的数据编码
enc.transform([['A']]).toarray() #将字符A根据原有规则进行转码
#由于OneHotEncoder返回的是稀疏矩阵,所以需要使用toarray函数将矩阵转换
enc.fit_transform(data).toarray()
根据打印结果,字符A代表编码[1,0,0],字符B代表编码[0,1,0],C代表编码为[0,0,1]
在这里补充一下稀疏矩阵的知识:
import numpy as np
from scipy.sparse import csr_matrix
# 创建一个稀疏矩阵
data = np.array([1, 2, 3, 4, 5, 6])
row_ind = np.array([0, 0, 1, 2, 2, 2])
col_ind = np.array([0, 2, 2, 0, 1, 2])
sparse_matrix = csr_matrix((data, (row_ind, col_ind)), shape=(3, 3))
print(sparse_matrix)
dense_matrix = sparse_matrix.toarray()
# 打印转换后的 NumPy 数组
print("\nDense Matrix:")
print(dense_matrix)
稀疏矩阵是一种用于存储和操作大型矩阵的方法,这些矩阵中大部分元素都是零,因此使用专门的数据结构来存储非零元素及其位置,可以大大节省内存和计算资源。简单来讲稀疏矩阵将矩阵中为0的部分省略,例如上述括号代表数字在矩阵中的位置。
通过toarray函数将矩阵进行还原。
独热编码优缺点:
优点:为处理离散型特征提供了方法,在一定程度上扩充了特征属性。
缺点:当特征的类别很多时,特征空间会变得非常大,在这种情况下,一般可以用PCA来减少维度。
如果离散特征的取值之间没有大小意义时,可以使用独热编码,例如学习成绩优>良>及格。
4. 数据集的标签还原
Data['sex'][Data['sex'] == 1] = 'Male' #选中列标签后新增一个中括号[]里面加入判定条件
# 如果你需要查看原始标签到整数的映射
print(le.classes_) # 输出: ['bird' 'cat' 'dog'],注意这不是按字母顺序的
# 如果你需要将整数转换回原始标签
labels_decoded = le.inverse_transform(labels_encoded)
print(labels_decoded) # 输出: ['dog' 'cat' 'bird' 'dog' 'cat']
如果通过使用LabelEncoder将标签数值化,也可以使用同样的方式将标签还原 .
5. 参考资料
机器学习:数据预处理之独热编码(One-Hot)详解-CSDN博客