👍 个人博客【 洛秋小站】洛秋资源小站【洛秋资源小站

sklearn基础教程:从入门到精通

Scikit-learn(简称sklearn)是Python中一个强大且易于使用的机器学习库。它提供了丰富的工具集,包括数据预处理、特征选择、模型训练、评估和预测。本文将带领读者从零开始,详细讲解sklearn的基本用法,并通过多个实例帮助读者掌握如何在实际项目中应用这款工具。

一、sklearn简介

Scikit-learn是一个开源的机器学习库,基于NumPy、SciPy和matplotlib构建。它为机器学习提供了简单而高效的工具,并且具有以下特点:

  • 丰富的算法支持:包含了回归、分类、聚类、降维等多种机器学习算法。
  • 易用性:提供了简洁的API接口,便于快速上手和使用。
  • 良好的文档支持:详细的文档和大量的示例代码,便于学习和参考。

二、安装与配置

安装scikit-learn非常简单,只需使用pip命令即可。

pip install scikit-learn

安装完成后,可以通过以下命令检查安装是否成功:

import sklearn
print(sklearn.__version__)

三、数据预处理

数据预处理是机器学习的第一步,也是非常关键的一步。良好的数据预处理可以显著提高模型的性能。下面我们将介绍数据预处理的几项重要操作。

数据导入

首先,我们需要导入数据。sklearn提供了一些内置的数据集,方便我们进行学习和测试。以下示例展示了如何加载波士顿房价数据集。

from sklearn.datasets import load_boston
import pandas as pd

# 加载数据集
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['PRICE'] = boston.target

# 查看数据集前几行
print(data.head())

数据清洗

数据清洗包括处理缺失值、重复值和异常值。

# 检查缺失值
print(data.isnull().sum())

# 删除含有缺失值的行
data = data.dropna()

# 检查重复值
print(data.duplicated().sum())

# 删除重复值
data = data.drop_duplicates()

特征选择

特征选择是通过选择最有用的特征来提高模型的性能和可解释性。

from sklearn.feature_selection import SelectKBest, f_regression

# 选择最有用的5个特征
selector = SelectKBest(f_regression, k=5)
X_new = selector.fit_transform(data.drop('PRICE', axis=1), data['PRICE'])

# 查看选择的特征
print(X_new[:5])

数据标准化与归一化

数据标准化和归一化是为了将数据缩放到相同的尺度上,从而提高模型的训练效果。

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data.drop('PRICE', axis=1))

# 归一化
scaler = MinMaxScaler()
data_normalized = scaler.fit_transform(data.drop('PRICE', axis=1))

四、常用模型介绍与应用

线性回归

线性回归是一种最简单的回归模型,用于预测连续型目标变量。

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(data.drop('PRICE', axis=1), data['PRICE'], test_size=0.2, random_state=42)

# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

逻辑回归

逻辑回归常用于分类问题,尤其是二分类问题。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载数据集(以鸢尾花数据集为例)
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

决策树

决策树是一种非参数的监督学习方法,可以用于分类和回归。

from sklearn.tree import DecisionTreeClassifier

# 训练模型
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

支持向量机

支持向量机(SVM)是一种用于分类和回归的监督学习模型。

from sklearn.svm import SVC

# 训练模型
model = SVC()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

K近邻算法

K近邻算法(KNN)是一种简单的非参数分类和回归方法。

from sklearn.neighbors import KNeighborsClassifier

# 训练模型
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

随机森林

随机森林是一种集成学习方法,通过构建多个决策树来提高模型的准确性和稳定性。

from sklearn.ensemble import RandomForestClassifier

# 训练模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

集成学习

集成学习通过组合多个模型来提高预测性能。常见的集成学习方法包括Bagging、Boosting和Stacking。

from sklearn.ensemble import GradientBoostingClassifier

# 训练模型
model = GradientBoostingClassifier(n_estimators=100)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

五、模型评估与调优

交叉验证

交叉验证是一种评估模型性能的方法,通过多次分割数据集来获取模型的稳定性和泛化能力。

from sklearn.model_selection import cross_val_score

# 使用交叉验证评估模型
scores = cross_val_score(model, X, y, cv=5)
print("Cross-Validation Scores:", scores)
print("Mean Score:", scores.mean())

网格搜索

网格搜索是一种超参数调优方法,通过遍历所有可能的参数组合来找到最佳参数。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20, 30]
}

# 进行网格搜索
grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best Parameters:", grid_search.best_params_)

模型评估指标

常见的模型评估指标包括准确率、精确率、召回率、F1分数等。

from sklearn.metrics import precision_score, recall_score, f1_score

# 计算精确率
precision = precision

_score(y_test, y_pred, average='macro')
print("Precision:", precision)

# 计算召回率
recall = recall_score(y_test, y_pred, average='macro')
print("Recall:", recall)

# 计算F1分数
f1 = f1_score(y_test, y_pred, average='macro')
print("F1 Score:", f1)

六、实战案例

波士顿房价预测

以下示例展示了如何使用线性回归模型预测波士顿房价。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

手写数字识别

以下示例展示了如何使用支持向量机模型进行手写数字识别。

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载数据集
digits = load_digits()
X, y = digits.data, digits.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = SVC()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

客户流失预测

以下示例展示了如何使用随机森林模型预测客户流失。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
data = pd.read_csv('customer_churn.csv')
X = data.drop('Churn', axis=1)
y = data['Churn']

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

七、测试接口与详细解释

在实际开发中,测试是保证代码质量和模型性能的重要环节。sklearn中没有直接的测试模块,但我们可以使用Python的unittest库来进行模型和接口的测试。

单元测试

以下示例展示了如何使用unittest进行模型的单元测试。

import unittest
from sklearn.linear_model import LinearRegression

class TestLinearRegression(unittest.TestCase):

    def setUp(self):
        self.model = LinearRegression()
        self.X_train = [[1, 2], [2, 3], [3, 4], [4, 5]]
        self.y_train = [2, 3, 4, 5]

    def test_fit(self):
        self.model.fit(self.X_train, self.y_train)
        self.assertTrue(hasattr(self.model, 'coef_'), "Model should have coefficients after fitting")

    def test_predict(self):
        self.model.fit(self.X_train, self.y_train)
        y_pred = self.model.predict([[5, 6]])
        self.assertEqual(len(y_pred), 1, "Prediction should return one value")

if __name__ == '__main__':
    unittest.main()

接口测试

接口测试用于确保系统各部分之间的交互正常。以下示例展示了如何使用unittest进行简单的接口测试。

import unittest
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

class TestLogisticRegressionAPI(unittest.TestCase):

    def setUp(self):
        self.data = load_iris()
        self.X, self.y = self.data.data, self.data.target
        self.model = LogisticRegression()
        self.model.fit(self.X, self.y)

    def test_predict(self):
        y_pred = self.model.predict(self.X)
        self.assertEqual(len(y_pred), len(self.y), "Prediction length should match input length")

    def test_predict_proba(self):
        proba = self.model.predict_proba(self.X)
        self.assertEqual(proba.shape, (len(self.y), 3), "Probability prediction should return correct shape")

if __name__ == '__main__':
    unittest.main()

八、总结

我们探讨了sklearn的基础知识和常用操作。sklearn以其丰富的功能和简洁的API,广泛应用于机器学习领域。从数据预处理、模型训练到模型评估,sklearn提供了一站式的解决方案。

👉 最后,愿大家都可以解决工作中和生活中遇到的难题,剑锋所指,所向披靡~