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提供了一站式的解决方案。
👉 最后,愿大家都可以解决工作中和生活中遇到的难题,剑锋所指,所向披靡~