import pandas as pd
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
# 读取数据
data = pd.read_csv('data.csv')
# 检查缺失值并填补
data = data.fillna(data.mean())
# 创建一个LabelEncoder对象
le = LabelEncoder()
# 对所有需要编码的列进行Label Encoding
for column in ['Marital status', 'Application mode', 'Course', 'Daytime/evening attendance', 'Previous qualification', 'Nacionality', 'Mother\'s qualification', 'Father\'s qualification', 'Mother\'s occupation', 'Father\'s occupation', 'Gender', 'Target']:
data[column] = le.fit_transform(data[column])
# 创建一个StandardScaler对象
scaler = StandardScaler()
# 对数值型特征进行标准化
numeric_columns = ['Previous qualification (grade)', 'Admission grade', 'Curricular units 1st sem (grade)', 'Curricular units 2nd sem (grade)', 'Unemployment rate', 'Inflation rate', 'GDP']
data[numeric_columns] = scaler.fit_transform(data[numeric_columns])
# 使用IQR方法处理异常值
for column in numeric_columns:
Q1 = data[column].quantile(0.25)
Q3 = data[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
data[column] = np.where(data[column] < lower_bound, lower_bound, data[column])
data[column] = np.where(data[column] > upper_bound, upper_bound, data[column])
# 提取特征和目标变量
X = data.drop('Target', axis=1)
y = data['Target']
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
关键代码解释:
# 创建一个LabelEncoder对象 le = LabelEncoder() # 对所有需要编码的列进行Label Encoding for column in ['Marital status', 'Application mode', 'Course', 'Daytime/evening attendance', 'Previous qualification', 'Nacionality', 'Mother\'s qualification', 'Father\'s qualification', 'Mother\'s occupation', 'Father\'s occupation', 'Gender', 'Target']: data[column] = le.fit_transform(data[column])
这段代码使用了LabelEncoder来对指定的列进行编码。举例来说,如果我们有一个"Marital status"列,其中包含"single"、"married"和"divorced"这三种不同的值,LabelEncoder会将它们编码成0、1和2。这种编码方式对于机器学习模型来说更易于理解和处理。
举个例子:
假设原始的"Marital status"列包含以下数据:
- 单身(single)
- 已婚(married)
- 离异(divorced)
经过LabelEncoder编码后会变成:
- 单身(single) -> 0
- 已婚(married) -> 1
- 离异(divorced) -> 2
这样做的好处是,对于机器学习算法而言,原始的文本数据已经被转换为数值型数据,可以更好地被算法所理解和利用。
# 对数值型特征进行标准化 numeric_columns = ['Previous qualification (grade)', 'Admission grade', 'Curricular units 1st sem (grade)', 'Curricular units 2nd sem (grade)', 'Unemployment rate', 'Inflation rate', 'GDP'] data[numeric_columns] = scaler.fit_transform(data[numeric_columns])
标准化是一种常见的数据预处理步骤,用于确保数据的各个特征具有相似的尺度,这样有助于许多机器学习算法更快地收敛并且避免某些特征对模型产生更大的影响。
举例说明,假设我们有三个特征:年龄、收入和支出。年龄的值通常在几十到几百之间,而收入和支出的值则可能在几千到几十万之间。这种情况下,模型可能会认为收入和支出的特征比年龄的特征更重要,因为它们的数值更大。标准化就是为了解决这个问题。
标准化的步骤如下:
- 对每个特征的数值进行减去该特征的均值(即使得特征的均值为0)。
- 然后除以该特征的标准差,以确保特征的方差为1。
举例来说,假设我们要对年龄、收入和支出这三个特征进行标准化,其中数值如下:
- 年龄:25, 30, 35
- 收入:50000, 75000, 100000
- 支出:10000, 15000, 20000
经过标准化后的结果可能如下:
- 年龄:-1.224, 0.0, 1.224
- 收入:-1.224, 0.0, 1.224
- 支出:-1.224, 0.0, 1.224
这样,在模型训练时,各个特征的尺度都统一了,不会因为数值的差异而造成模型的偏好。
# 使用IQR方法处理异常值 for column in numeric_columns: Q1 = data[column].quantile(0.25) Q3 = data[column].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR data[column] = np.where(data[column] < lower_bound, lower_bound, data[column]) data[column] = np.where(data[column] > upper_bound, upper_bound, data[column])IQR(Interquartile Range,四分位距)是一种用于识别和处理异常值的统计方法。
IQR的计算:
- 首先,对数据进行排序并将其分为四等分,称为四分位数。
- Q1代表着数据集的25th百分位数,而Q3代表着75th百分位数。
- IQR被定义为Q3和Q1的差值:IQR = Q3 - Q1。
异常值的识别:
- 通过计算出的IQR,我们定义“异常值”的下限为 Q1 - 1.5 * IQR,上限为 Q3 + 1.5 * IQR。
- 任何低于下限或高于上限的数值都被认为是异常值。
处理异常值的方法:
- 低于下限的异常值将被替换为下限值。
- 高于上限的异常值将被替换为上限值。
举个例子,假设我们有以下数据集:
[ 3, 5, 7, 10, 12, 15, 18, 100 ]
- 首先计算Q1和Q3:
- Q1 = 6
- Q3 = 15.5
- 计算IQR:
- IQR = 15.5 - 6 = 9.5
- 计算异常值的上下限:
- 下限 = 6 - 1.5 * 9.5 = -7.25
- 上限 = 15.5 + 1.5 * 9.5 = 28.75
- 处理异常值:
- 3, 5, 7, 10, 12, 15, 18 不是异常值。
- 100 超出了异常值的上限,因此被替换为 28.75。
这样处理之后,异常值被替换为了上限值,从而使得数据集中不再存在异常值。