html
在Python中构建K-最近邻(KNN)模型:全面指南
欢迎阅读这篇关于在Python中构建K-最近邻(KNN)模型的全面指南。无论您是数据科学爱好者还是经验丰富的专业人士,本文将引导您完成开发KNN分类器的每一个步骤,从数据预处理到模型评估。在本指南结束时,您将对如何使用Python强大的库实现KNN有一个坚实的理解。
目录
K-最近邻(KNN)简介
K-最近邻(KNN) 是一种简单而有效的监督机器学习算法,适用于分类和回归任务。KNN算法根据其邻居的分类来对数据点进行分类。它直观、易于实现,并且不需要训练阶段,使其在实时预测中高效。
KNN的关键特性:
- 懒惰学习: KNN不建立内部模型;它记忆训练数据集。
- 基于实例: 预测基于来自训练数据的实例(邻居)。
- 非参数化: KNN不对底层数据分布做任何假设。
理解数据集
在本教程中,我们将使用来自Kaggle的WeatherAUS数据集。该数据集包含多个澳大利亚地点多年来记录的天气属性。
数据集概述:
特征
目标变量
Date, Location, MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM
RainTomorrow(是/否)
数据预处理
数据预处理是机器学习中的关键步骤。它涉及将原始数据转换为可理解的格式。适当的预处理可以显著提升机器学习算法的性能。
处理缺失数据
缺失数据会对机器学习模型的性能产生不利影响。我们将处理数值和分类特征的缺失值。
数值数据
- 识别数值列:
1
numerical_cols = list(np.where((X.dtypes == np.int64) | (X.dtypes == np.float64))[0])
- 用均值填补缺失值:
1234
from sklearn.impute import SimpleImputerimp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')imp_mean.fit(X.iloc[:, numerical_cols])X.iloc[:, numerical_cols] = imp_mean.transform(X.iloc[:, numerical_cols])
分类数据
- 识别分类列:
1
string_cols = list(np.where((X.dtypes == object))[0])
- 用众数(最频繁值)填补缺失值:
123
imp_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent')imp_mode.fit(X.iloc[:, string_cols])X.iloc[:, string_cols] = imp_mode.transform(X.iloc[:, string_cols])
编码分类变量
机器学习算法需要数值输入。因此,我们需要将分类变量转换为数值格式。
标签编码
标签编码根据字母顺序为每个类别分配一个唯一的整数。
12345
from sklearn import preprocessing def LabelEncoderMethod(series): le = preprocessing.LabelEncoder() return le.fit_transform(series)
独热编码
独热编码为每个类别创建二进制列。
123456789
from sklearn.compose import ColumnTransformerfrom sklearn.preprocessing import OneHotEncoder def OneHotEncoderMethod(indices, data): columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), indices)], remainder='passthrough' ) return columnTransformer.fit_transform(data)
编码选择函数
此函数根据唯一类别的数量决定是应用标签编码还是独热编码。
12345678910111213
def EncodingSelection(X, threshold=10): string_cols = list(np.where((X.dtypes == object))[0]) one_hot_encoding_indices = [] for col in string_cols: length = len(pd.unique(X[X.columns[col]])) if length == 2 or length > threshold: X[X.columns[col]] = LabelEncoderMethod(X[X.columns[col]]) else: one_hot_encoding_indices.append(col) X = OneHotEncoderMethod(one_hot_encoding_indices, X) return X
应用编码:
1
X = EncodingSelection(X)
特征选择
选择相关特征可以提升模型性能。
- 应用SelectKBest和卡方检验:
12345678910
from sklearn.feature_selection import SelectKBest, chi2from sklearn import preprocessing kbest = SelectKBest(score_func=chi2, k=10)MMS = preprocessing.MinMaxScaler()x_temp = MMS.fit_transform(X)x_temp = kbest.fit(x_temp, y)best_features = np.argsort(x_temp.scores_)[-13:]features_to_delete = np.argsort(x_temp.scores_)[:-13]X = np.delete(X, features_to_delete, axis=1)
- 结果形状:
1
print(X.shape) # Output: (142193, 13)
训练集与测试集划分
将数据集划分为训练集和测试集,确保模型在未见过的数据上进行评估。
123456
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=1)print(X_train.shape) # Output: (113754, 13)
特征缩放
特征缩放标准化独立变量的范围,确保每个特征对结果的贡献相同。
- 标准化:
12345
from sklearn import preprocessingsc = preprocessing.StandardScaler(with_mean=False)sc.fit(X_train)X_train = sc.transform(X_train)X_test = sc.transform(X_test)
- 检查形状:
12
print(X_train.shape) # Output: (113754, 13)print(X_test.shape) # Output: (28439, 13)
构建KNN模型
数据预处理完成后,我们现在可以构建KNN分类器。
- 导入KNeighborsClassifier:
1
from sklearn.neighbors import KNeighborsClassifier
- 初始化分类器:
1
knnClassifier = KNeighborsClassifier(n_neighbors=3)
- 训练模型:
1
knnClassifier.fit(X_train, y_train)
- 进行预测:
1
y_pred = knnClassifier.predict(X_test)
- 单个预测示例:
12
single_prediction = knnClassifier.predict([X_test[0]])print(single_prediction) # Output: [1] (1 indicates 'Yes' for RainTomorrow)
- 预测概率:
12
prediction_prob = knnClassifier.predict_proba([X_test[0]])print(prediction_prob) # Output: [[0.33333333 0.66666667]]
模型评估
评估模型的性能对于了解其准确性和可靠性至关重要。
- 导入准确率评分:
1
from sklearn.metrics import accuracy_score
- 计算准确率:
12
accuracy = accuracy_score(y_pred, y_test) * 100print(f"Accuracy: {accuracy:.2f}%") # Output: Accuracy: 90.28%
解释:
- KNN模型达到了90.28%的准确率,表明它在超过90%的情况下正确预测了第二天的降雨状态。这一高准确率表明该模型非常适合此分类任务。
结论
在本指南中,我们完成了在Python中构建K-最近邻(KNN)模型的整个过程:
- 数据导入: 使用WeatherAUS数据集。
- 数据预处理: 处理缺失值、编码分类变量和选择相关特征。
- 训练集与测试集划分及特征缩放: 为训练做准备,并确保特征的统一性。
- 模型构建: 训练KNN分类器并进行预测。
- 模型评估: 评估模型的准确率。
KNN算法证明是分类任务中的一个强大选择,尤其是在数据经过良好预处理的情况下。然而,必须尝试不同的超参数(如邻居数)和交叉验证技术,以进一步提升模型性能。
附加资源
模型构建愉快! 🚀
免责声明:本文基于视频教程的转录,并辅以Jupyter Notebook和Python脚本中的代码示例。请根据您的具体数据集和需求调整和修改代码。