机器学习之学习曲线绘制Python-skleran

学习曲线作用:

学习曲线是什么?简单来说,就是用学习曲线(learning curve)来判断模型状态:过拟合还是欠拟合。

学习曲线定义:

学习曲线是根据不同训练集大小,模型在训练集和验证集上的得分变化曲线。

学习曲线通俗解释:

也就是以样本数为横坐标,训练和交叉验证集上的得分(如准确率)为纵坐标。learning curve可以帮助我们判断模型现在所处的状态:过拟合(overfiting / high variance) or 欠拟合。

模型欠拟合、过拟合、 时对应的学习曲线如下图所示:

 

 对上图的解释:

(1)左上角的图中训练集和验证集上的曲线能够收敛。在训练集合验证集上准确率相差不大,却都很差。这说明模拟对已知数据和未知都不能进行准确的预测,属于高偏差(欠拟合)。这种情况模型很可能是欠拟合。可以针对欠拟合采取对应的措施。

欠拟合措施:我们可以增加模型参数(特征),比如,构建更多的特征,减小正则项。采用更复杂的模型。此时通过增加数据量是不起作用的。(为什么?)

(2)右上角的图中模型在训练集上和验证集上的准确率差距很大。说明模型能够很好的拟合已知数据,但是泛化能力很差,属于高方差(过拟合)。模拟很可能过拟合,要采取过拟合对应的措施。

过拟合措施:我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数,即做一下feature selection,挑出较好的feature的subset来做training

(3)理想情况是找到偏差和方差都很小的情况,即收敛且误差较小。如右角的图(完美)
 

Python代码(sklearn库):

train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=[0.1,0.25,0.5,0.75,1])

print(train_sizes)
    print(train_scores)
    print(test_scores)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
[ 143  359  718 1077 1437]
[[0.93006993 0.94405594 0.95104895 0.87412587 0.95804196]
 [0.8718663  0.90529248 0.91643454 0.88022284 0.90807799]
 [0.8718663  0.86908078 0.90807799 0.88857939 0.8816156 ]
 [0.86258124 0.88857939 0.89415042 0.87093779 0.87743733]
 [0.8559499  0.86986778 0.87543493 0.86499652 0.85247042]]
[[0.79722222 0.73611111 0.68888889 0.76388889 0.74444444]
 [0.81944444 0.86111111 0.83611111 0.83055556 0.825     ]
 [0.82777778 0.86666667 0.84722222 0.85555556 0.85      ]
 [0.83611111 0.89444444 0.85277778 0.85277778 0.84444444]
 [0.825      0.89444444 0.85       0.86111111 0.86944444]]

learning_curve函数中参数解释:

estimator表示我们所使用的的估计器 
X输入的feature
y : 输入的target
CV: 做训练集切割成训练集和验证集的时候的折数,cv=5就是5折交叉验证。
train_sizes: 随着训练集的增大,选择在10%,25%,50%,75%,100%的训练集大小上进行采样。比如(CV= 5)10%的意思是先在训练集上选取10%的数据进行五折交叉验证。

返回值解释:

train_sizes:为列表。对应10%,25%,50%,75%,100%的数据量。比如训练集为100,则10%的返回量为10.
train_scores:如上为numpy数组,第一行五个数据为抽取原始训练集10%的数据做的五折交叉验证的训练集指标。,第二行五个数据为抽取原始训练集25%的数据做的五折交叉验证的训练集指标。等等。
test_scores:如上为numpy数组,第一行五个数据为抽取原始训练集10%的数据做的五折交叉验证的验证集指标。,第二行五个数据为抽取原始训练集25%的数据做的五折交叉验证的验证集指标。等等。

 完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits



def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=None):
    '''
    绘制出模型的学习曲线
    '''
    plt.title(title)
    if ylim is not None:
        plt.ylim(*ylim)
    train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=[0.1,0.25,0.5,0.75,1])
    train_scores_mean = np.mean(train_scores, axis=1)
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1,
                 color="r", )  # 把模型准确性的平均值的上下标准差的空间里用颜色填充
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1,
                 color="g", )  # 把模型准确性的平均值的上下标准差的空间里用颜色填充
    plt.plot(train_sizes, train_scores_mean, "o-", color="r", label="Training score")
    plt.plot(train_sizes, test_scores_mean, "o-", color="g", label="Cross-validation score")
    plt.legend(loc="best")
    return plt



# 加载数据集
X, y = load_digits(return_X_y=True)
cv1 = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)  # 数据集分成5份,每份中测试集比例为0.2
estimator1 = GaussianNB()

title1 = "(Naive Bayes)"
plt.subplot(121)
plot_learning_curve(estimator1, title1, X, y, ylim=(0.7, 1.01), cv=cv1, n_jobs=4)
plt.show()

 由图可得:随着样本数抽取增加模型有着过拟合向刚刚好过渡

### 回答1: 以下是机器学习Python绘制PR曲线的示例代码: ```python from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt import numpy as np y_true = np.array([0, 0, 1, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.9]) precision, recall, thresholds = precision_recall_curve(y_true, y_scores) plt.plot(recall, precision, linestyle='--', label='PR curve') plt.xlabel('Recall') plt.ylabel('Precision') plt.legend() plt.show() ``` 其中,y_true表示真实标签,y_scores表示模型输出的预测概率。precision_recall_curve函数会返回一组精确率、召回率和阈值,我们将这些数据绘制成PR曲线即可。 ### 回答2: PR曲线是二元分类模型性能评估的重要指标之一,它可以衡量出在"有多少真实的数据预测成正样本的同时预测对了多少个真实的正样本"的性能,适用于不平衡数据集的情况。 在Python中,我们可以利用sklearn库,调用precision_recall_curve()函数绘制PR曲线。具体步骤如下: 1. 导入必要的库 ``` import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve from sklearn.metrics import plot_precision_recall_curve ``` 2. 准备数据集 假设我们有一个二分类数据集,标签为1表示正样本,标签为0表示负样本。我们可以从csv文件中读取数据,或者利用一些数据生成的方法。 ``` X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.95,0.05], random_state=42) ``` 3. 拆分数据集 由于绘制PR曲线需要使用测试集,所以我们需要把数据集拆分成训练集和测试集。 ``` from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 4. 训练模型 利用我们选择的二分类模型,例如Logistic回归或者随机森林模型等,从训练数据集中训练一个模型。 ``` from sklearn.ensemble import RandomForestClassifier clf = RandomForestClassifier(n_estimators=100, random_state=42) clf.fit(X_train, y_train) ``` 5. 绘制PR曲线 利用precision_recall_curve()函数计算每个阈值下的准确率和召回率,然后绘制出PR曲线。 ``` disp = plot_precision_recall_curve(clf, X_test, y_test) plt.show() ``` 以上是用Python绘制PR曲线的基本步骤,你可以根据实际需要进行微调和优化。 ### 回答3: PR曲线是机器学习中用于评估二分类模型性能的重要指标之一。它是Precision与Recall的关系曲线,通过绘制Precision与Recall的关系曲线可以更直观、准确地评估模型性能。在Python中,我们可以使用Scikit-Learn库的以下函数来绘制PR曲线: from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt # 假设y_true为真实标签,y_scores为分类模型输出的概率值 precision, recall, thresholds = precision_recall_curve(y_true, y_scores) # 绘制PR曲线图 plt.plot(recall, precision, label='PR curve') plt.xlabel('Recall') plt.ylabel('Precision') plt.title('Precision-Recall Curve') plt.legend(loc='best') plt.show() 其中,y_true为真实标签,y_scores为分类模型输出的概率值。函数precision_recall_curve可以返回precision、recall以及每个阈值的数值,即thresholds,这些数值可以用于后续的计算或可视化操作。绘制PR曲线使用Matplotlib库的plot函数,将recall作为横坐标、precision作为纵坐标,即可得到PR曲线。对于PR曲线的图像优化可以用title函数来添加标题,用xlabel和ylabel函数进行轴标签的添加以及legend函数添加图例。最后将PR曲线图用show函数显示。 绘制PR曲线,是对模型在正例(positive)和负例(negative)两个方面的表现都进行评估的一种方法,可以帮助用户更准确地判断模型的性能,具有重要的应用价值和研究意义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值