Python 数据科学实战:如何使用 Scikit-learn 进行机器学习建模? 机器学习是现代数据科学中最热门的领域之一。随着数据量的不断增长和计算效率的提高,机器学习模型的应用越来越广泛,从自然语言处理到图像识别到推荐系统等各种场景都有广泛应用。 Scikit-learn 是 Python 的一个优秀开源机器学习库,具有成熟的算法实现、易于使用的 API 和广泛的文档。在本文中,我们将介绍如何使用 Scikit-learn 进行机器学习建模。 1. 数据集的准备 在使用 Scikit-learn 进行机器学习之前,我们需要准备数据集。 Scikit-learn 含有一些示例数据集,可以用于学习和测试机器学习模型。在本文中,我们将使用 Scikit-learn 中自带的鸢尾花数据集。鸢尾花数据集包含 3 类不同的鸢尾花,每类鸢尾花有 50 个样本,每个样本有 4 个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。我们将使用这个数据集来演示如何使用 Scikit-learn 进行机器学习建模。 下面的代码将从 Scikit-learn 中导入鸢尾花数据集: ``` from sklearn.datasets import load_iris iris = load_iris() ``` 2. 数据集的探索 在进行机器学习建模之前,我们需要对数据集进行探索,以了解数据的分布和特征之间的关系。 Scikit-learn 提供了一些工具,可以帮助我们探索数据集。例如,我们可以使用 pandas 库加载数据集,并使用 describe() 函数生成数据集的统计信息。 ``` import pandas as pd iris_df = pd.DataFrame(iris['data'], columns=iris['feature_names']) iris_df['target'] = iris['target'] print(iris_df.describe()) ``` 输出结果如下所示: ``` sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target count 150.000000 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 1.000000 std 0.828066 0.435866 1.765298 0.762238 0.819232 min 4.300000 2.000000 1.000000 0.100000 0.000000 25% 5.100000 2.800000 1.600000 0.300000 0.000000 50% 5.800000 3.000000 4.350000 1.300000 1.000000 75% 6.400000 3.300000 5.100000 1.800000 2.000000 max 7.900000 4.400000 6.900000 2.500000 2.000000 ``` 由此可见,数据集中每个特征都有 150 个样本,其中平均值、标准差、最小值、最大值、第一四分位数、中位数和第三四分位数都已给出。我们还可以使用 seaborn 库绘制散点图矩阵,以了解特征之间的关系。 ``` import seaborn as sns sns.pairplot(iris_df, hue='target') ``` 输出结果如下所示: ![image1.png](https://cdn.nlark.com/yuque/0/2022/png/97322/1664639710598-d503f98e-06c5-4a41-9e3b-7c1e738c3fde.png#clientId=u3feb8a4c-633c-4&from=paste&id=uf8c928ac&margin=%5Bobject%20Object%5D&originHeight=421&originWidth=627&originalType=binary&ratio=1&status=done&style=none&taskId=u39b6f8ab-7ca3-4d48-8210-e6a7b6f2217) 由此可见,花瓣长度和花瓣宽度与花的类别之间存在较强的关系。因此,这两个特征可能是分类器的关键特征。 3. 特征工程 在进行机器学习建模之前,我们通常需要进行特征工程,以提高模型的效果。特征工程是一个迭代过程,需要根据具体情况不断尝试不同的特征变换和特征选择,以选择最佳的特征子集。在本文中,我们将使用 Scikit-learn 中的 SelectKBest 函数进行特征选择。 ``` from sklearn.feature_selection import SelectKBest X = iris.data y = iris.target # 特征选择 selector = SelectKBest(k=2) X_new = selector.fit_transform(X, y) print(X_new.shape) ``` 输出结果如下所示: ``` (150, 2) ``` 由此可见,我们选择了 2 个最佳特征子集,分别是花瓣长度和花瓣宽度。这两个特征是分类器的最佳特征。 4. 模型选择 在进行机器学习建模之前,我们需要选择合适的模型。 Scikit-learn 中包含了许多流行的机器学习算法,例如逻辑回归、决策树和随机森林。在本文中,我们将使用支持向量机(SVM)算法进行建模。 ``` from sklearn.svm import SVC from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.3, random_state=42) # 建立 SVM 模型 model = SVC(kernel='linear', C=1) model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 准确率 acc = accuracy_score(y_test, y_pred) print(f"Accuracy: {acc}") ``` 输出结果如下所示: ``` Accuracy: 0.9333333333333333 ``` 由此可见,我们的 SVM 模型可以在鸢尾花数据集上达到 93.33% 的准确率。这是一个非常不错的结果。 5. 建模调优 在进行机器学习建模之后,我们通常需要进行建模调优,以提高模型的效果。 Scikit-learn 中包含了许多流行的建模调优工具,例如 GridSearchCV 和 RandomizedSearchCV。在本文中,我们将使用 GridSearchCV 进行建模调优。 ``` from sklearn.model_selection import GridSearchCV # 设置参数范围 param_grid = {'C': [0.1, 1, 10, 100], 'kernel': ['linear', 'poly', 'rbf', 'sigmoid'], 'gamma': ['scale', 'auto']} # 建立 GridSearchCV 实例 grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=3) # 训练 GridSearchCV 实例 grid.fit(X_train, y_train) # 预测 y_pred = grid.predict(X_test) # 准确率 acc = accuracy_score(y_test, y_pred) print(f"Accuracy: {acc}") ``` 输出结果如下所示: ``` Fitting 5 folds for each of 32 candidates, totalling 160 fits [CV] C=0.1, gamma=scale, kernel=linear .............................. [CV] .. C=0.1, gamma=scale, kernel=linear, score=0.952, total= 0.0s [CV] C=0.1, gamma=scale, kernel=linear .............................. [CV] .. C=0.1, gamma=scale, kernel=linear, score=0.952, total= 0.0s [CV] C=0.1, gamma=scale, kernel=linear .............................. [CV] .. C=0.1, gamma=scale, kernel=linear, score=1.000, total= 0.0s [CV] C=0.1, gamma=scale, kernel=linear .............................. [CV] .. C=0.1, gamma=scale, kernel=linear, score=0.905, total= 0.0s [CV] C=0.1, gamma=scale, kernel=linear .............................. [CV] .. C=0.1, gamma=scale, kernel=linear, score=0.952, total= 0.0s ...... [CV] C=100, gamma=auto, kernel=sigmoid .............................. [CV] .. C=100, gamma=auto, kernel=sigmoid, score=0.952, total= 0.0s [CV] C=100, gamma=auto, kernel=sigmoid .............................. [CV] .. C=100, gamma=auto, kernel=sigmoid, score=0.952, total= 0.0s [CV] C=100, gamma=auto, kernel=sigmoid .............................. [CV] .. C=100, gamma=auto, kernel=sigmoid, score=0.952, total= 0.0s [CV] C=100, gamma=auto, kernel=sigmoid .............................. [CV] .. C=100, gamma=auto, kernel=sigmoid, score=0.905, total= 0.0s [CV] C=100, gamma=auto, kernel=sigmoid .............................. [CV] .. C=100, gamma=auto, kernel=sigmoid, score=0.952, total= 0.0s Accuracy: 0.9333333333333333 ``` 由此可见,我们的 SVM 模型在经过 GridSearchCV 调优之后,准确率并未得到提高。这可能是因为我们的数据集比较简单,模型已经达到了最优效果。 6. 总结 在本文中,我们使用 Scikit-learn 对鸢尾花数据集进行了机器学习建模。我们探索了数据集,进行了特征工程,并使用 SVM 算法进行建模。我们还使用 GridSearchCV 进行建模调优,以提高模型的效果。 Scikit-learn 是一个非常优秀的机器学习库,包含了许多流行的机器学习算法和建模调优工具。我们希望本文可以帮助读者更好地了解 Scikit-learn 的使用方法,从而更好地进行机器学习建模。