1、拟合、预测、估算器、管道与模型评估
一、拟合和预测:估算器基础
1.1 资源导入、样本定义和训练
from sklearn.ensemble import RandomForestClassifier #随机森林分类器 """ random_state=0 将使用固定的随机数种子(在这个例子中是0)来初始化随机数生成器。 这样,无论你的代码运行多少次,只要数据集和其他参数保持不变,模型的训练过程和结果都将是相同的。 """ clf = RandomForestClassifier(random_state=0) X = [ [ 1, 2, 3], #2个样本,3个特征 [11, 12, 13] ] y = [0, 1] #每一个样本的类别 clf.fit(X, y) #训练
【输出】:
RandomForestClassifier
RandomForestClassifier(random_state=0)
1.2 预测
clf.predict(X) # 预测训练数据的标签
【输出2】:
array([0, 1])
1.3 新数据预测
clf.predict([[4, 5, 6], [14, 15, 16]]) # 预测新数据的标签
【输出3】:
array([0, 1])
【结论】:估算器拟合后,可用于预测新数据的目标值。你无需重新训练估算器
二、转换器和预处理器
#StandardScaler主要作用是将数据的均值调整为0,同时将数据的标准差调整为1 from sklearn.preprocessing import StandardScaler X = [[0, 15],[1, -10]] StandardScaler().fit(X).transform(X)
【输出】
array([[-1., 1.], [ 1., -1.]])
【结论】:转换对象没有预测方法,但是需要有一个输出新转换的样本矩阵X的转换方法:
三、管道:连接预处理器和估算器
3.1 资源导入、创建管道、数据拆分及训练
#案例:我们加载Iris数据集,将其分为训练集和测试集,然后根据测试数据计算管道的准确性得分: #对数据进行标准化处理标准化是将特征缩放到给定的范围(通常是均值为0,标准差为1)的过程 from sklearn.preprocessing import StandardScaler # 逻辑回归 from sklearn.linear_model import LogisticRegression """ make_pipeline 函数可以将多个转换器和估计器(比如 StandardScaler、PCA、LogisticRegression 等) 按照顺序连接起来,形成一个机器学习管道, make_pipeline 函数自动为每个步骤分配名称(比如第一个步骤会被命名为 standardscaler,第二个步骤会被命名为 pca), 并将它们按照顺序连接起来 """ from sklearn.pipeline import make_pipeline # 鸢尾花数据集 from sklearn.datasets import load_iris """ train_test_split函数接收多个参数,其中最重要的参数是原始数据集X和目标变量y, 以及测试集的大小test_size(通常为0.2或0.3) 。函数会根据test_size的比例自动将原始数据集划分为训练集和测试集, 划分是随机进行的,保证了训练集和测试集的样本分布与原始数据集相似。 """ from sklearn.model_selection import train_test_split #用于计算分类模型的准确率 # 它可以用来计算分类模型在测试集上的准确度,即分类正确的样本数占总样本数的比例 from sklearn.metrics import accuracy_score # 创建一个pipeline对象 pipe = make_pipeline( StandardScaler(), LogisticRegression(random_state=0) ) # 加载鸢尾花数据集并将其切分成训练集和测试集 X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) #训练整个pipeline pipe.fit(X_train, y_train)
【输出】:
3.2 计算模型预测准确率
# 我们现在可以像使用其他任何估算器一样使用它,计算模型在测试数据集上的预测准确率。 accuracy_score(pipe.predict(X_test), y_test)
【输出】:
0.9736842105263158
【结论】:管道还可以防止数据泄漏,即在训练数据中泄露一些测试数据。
四、模型评估,即交叉验证
# 创建合成的回归数据集 from sklearn.datasets import make_regression #线性回归用于描述一个连续型因变量和一系列自变量之间的关系 from sklearn.linear_model import LinearRegression """ (交叉验证)是一种用于评估模型性能的技术 交叉验证通过将数据集分割成多个小部分,然后多次对模型进行训练和验证的过程, 来评估模型的泛化能力和性能。这种方法主要用于防止模型过于复杂而引起的过拟合, 并通过多次进行这个过程来评估模型的泛化性能和稳定性。交叉验证不仅可以帮助评估统计分析、 机器学习算法对独立于训练数据的数据集的泛化能力,还能确保训练集和测试集的比例适当,以满足模型的评估需求。 """ from sklearn.model_selection import cross_validate X, y = make_regression(n_samples=1000, random_state=0) lr = LinearRegression() result = cross_validate(lr, X, y) # 默认为5折交叉验证 result['test_score'] # 此处R2得分很高的原因为数据集很简单
【输出】:
array([1., 1., 1., 1., 1.])
【结论】:用一些数据来训练模型并不意味着在一些未知的数据上也能预测得很好,因此需要对模型进行评估
五、自动参数搜索
5.1资源导入,创建随机搜索对象,及完成训练
""" 加利福尼亚的房价数据,房价作为目标变量(target) 这个数据集包含了20640个样本,每个样本有8个属性表示(所有属性值均为数字), """ from sklearn.datasets import fetch_california_housing #随机森林回归 from sklearn.ensemble import RandomForestRegressor #随机化搜索,即超参数优化方法 from sklearn.model_selection import RandomizedSearchCV """ train_test_split函数接收多个参数,其中最重要的参数是原始数据集X和目标变量y, 以及测试集的大小test_size(通常为0.2或0.3) 。函数会根据test_size的比例自动将原始数据集划分为训练集和测试集, 划分是随机进行的,保证了训练集和测试集的样本分布与原始数据集相似。 """ from sklearn.model_selection import train_test_split #用于生成一个指定范围内的随机整数 from scipy.stats import randint X, y = fetch_california_housing(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 定义要搜索的参数空间 param_distributions = {'n_estimators': randint(1, 5), 'max_depth': randint(5, 10)} # 现在创建一个searchCV 对象然后用数据训练它 search = RandomizedSearchCV( estimator=RandomForestRegressor(random_state=0), n_iter=5, param_distributions=param_distributions, random_state=0) search.fit(X_train, y_train)
【输出】:
5.2 保存最佳参数组合
#搜索,最佳参数组合,以便后续使用这些参数来训练模型,或者在模型调优过程中作为参考 # 搜索对象现在就像普通的随机森林估计器一样 # max_depth=9 和 n_estimators=4 search.best_params_
【输出】:
{'max_depth': 9, 'n_estimators': 4}
5.3 模型性能评估
""" 评估模型的性能 这个函数用于计算模型在测试集上的预测准确率, 即模型对测试数据(X_test,特征数据)进行预测后,与真实标签(y_test)进行比较, 计算预测正确的比例。这种方法适用于分类问题,其中预测结果和真实标签都是类别标签。 准确率是评估分类模型性能的一个基本指标,它反映了模型对未见数据的适应能力。 然而,对于更复杂的评估需求,可能需要计算其他指标,如精确率、召回率和F1分数等,以获得更全面的性能评 """ search.score(X_test, y_test)
【输出】:
0.735363411343253