问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何对XGBoost模型进行参数调优

发布网友 发布时间:2022-04-24 05:15

我来回答

1个回答

热心网友 时间:2022-04-11 02:34

XGBoost参数调优完全指南(附Python代码)


译注:文内提供的代码和运行结果有一定差异,可以从这里下载完整代码对照参考。另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只用其中一部分特征做的,具体数值跟文章中不一样,反而可以帮助理解文章。所以大家其实也可以小小修改一下代码,不一定要完全跟着教程做~ ^0^
需要提前安装好的库:

简介

如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。
构造一个使用XGBoost的模型十分简单。但是,提高这个模型的表现就有些困难(至少我觉得十分纠结)。这个算法使用了好几个参数。所以为了提高模型的表现,参数的调整十分必要。在解决实际问题的时候,有些问题是很难回答的——你需要调整哪些参数?这些参数要调到什么值,才能达到理想的输出?
这篇文章最适合刚刚接触XGBoost的人阅读。在这篇文章中,我们会学到参数调优的技巧,以及XGboost相关的一些有用的知识。以及,我们会用Python在一个数据集上实践一下这个算法。

你需要知道的

XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一个优化的版本。

特别鸣谢:我个人十分感谢Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果没有他的帮助,就没有这篇文章。在他的帮助下,我们才能给无数的数据科学家指点迷津。给他一个大大的赞!

内容列表

1、XGBoost的优势
2、理解XGBoost的参数
3、调整参数(含示例)

1、XGBoost的优势

XGBoost算法可以给预测模型带来能力的提升。当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势:

1、正则化

标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。 实际上,XGBoost以“正则化提升(regularized boosting)”技术而闻名。

2、并行处理

XGBoost可以实现并行处理,相比GBM有了速度的飞跃。 不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。 XGBoost 也支持Hadoop实现。

3、高度的灵活性

XGBoost 允许用户定义自定义优化目标和评价标准 它对模型增加了一个全新的维度,所以我们的处理不会受到任何*。

4、缺失值处理

XGBoost内置处理缺失值的规则。 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。

5、剪枝

当*时遇到一个负损失时,GBM会停止*。因此GBM实际上是一个贪心算法。 XGBoost会一直*到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个*。 这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续*,然后发现这两个*综合起来会得到+8,因此会保留这两个*。

6、内置交叉验证

XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。 而GBM使用网格搜索,只能检测有限个值。

7、在已有的模型基础上继续

XGBoost可以在上一轮的结果上继续训练。这个特性在某些特定的应用上是一个巨大的优势。 sklearn中的GBM的实现也有这个功能,两种算法在这一点上是一致的。

相信你已经对XGBoost强大的功能有了点概念。注意这是我自己总结出来的几点,你如果有更多的想法,尽管在下面评论指出,我会更新这个列表的!

2、XGBoost的参数

XGBoost的作者把所有的参数分成了三类:
1、通用参数:宏观函数控制。
2、Booster参数:控制每一步的booster(tree/regression)。
3、学习目标参数:控制训练目标的表现。
在这里我会类比GBM来讲解,所以作为一种基础知识。

通用参数

这些参数用来控制XGBoost的宏观功能。

1、booster[默认gbtree]

选择每次迭代的模型,有两种选择:
gbtree:基于树的模型
gbliner:线性模型

2、silent[默认0]

当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。

3、nthread[默认值为最大可能的线程数]

这个参数用来进行多线程控制,应当输入系统的核数。 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。
还有两个参数,XGBoost会自动设置,目前你不用管它。接下来咱们一起看booster参数。

booster参数

尽管有两种booster可供选择,我这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。

1、eta[默认0.3]

和GBM中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的鲁棒性。 典型值为0.01-0.2。

2、min_child_weight[默认1]

决定最小叶子节点样本权重和。 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。

3、max_depth[默认6]

和GBM中的参数相同,这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。 需要使用CV函数来进行调优。 典型值:3-10

4、max_leaf_nodes

树上最大的节点或叶子的数量。 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成

n2

个叶子。 如果定义了这个参数,GBM会忽略max_depth参数。

5、gamma[默认0]

在节点*时,只有*后损失函数的值下降了,才会*这个节点。Gamma指定了节点*所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。

6、max_delta_step[默认0]

这参数*每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。 这个参数一般用不到,但是你可以挖掘出来它更多的用处。

7、subsample[默认1]

和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1

8、colsample_bytree[默认1]

和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1

9、colsample_bylevel[默认1]

用来控制树的每一级的每一次*,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。

10、lambda[默认1]

权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

11、alpha[默认1]

权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。

12、scale_pos_weight[默认1]

在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。

学习目标参数

这个参数用来控制理想的优化目标和每一步结果的度量方法。

1、objective[默认reg:linear]

这个参数定义需要被最小化的损失函数。最常用的值有:
binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。

2、eval_metric[默认值取决于objective参数的取值]

对于有效数据的度量方法。 对于回归问题,默认值是rmse,对于分类问题,默认值是error。 典型值有:
rmse 均方根误差(

∑Ni=1?2N??????√

) mae 平均绝对误差(

∑Ni=1|?|N

) logloss 负对数似然函数值 error 二分类错误率(阈值为0.5) merror 多分类错误率 mlogloss 多分类logloss损失函数 auc 曲线下面积

3、seed(默认0)

随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数

如果你之前用的是Scikit-learn,你可能不太熟悉这些参数。但是有个好消息,python的XGBoost模块有一个sklearn包,XGBClassifier。这个包中的参数是按sklearn风格命名的。会改变的函数名是:
1、eta ->learning_rate
2、lambda->reg_lambda
3、alpha->reg_alpha
你肯定在疑惑为啥咱们没有介绍和GBM中的’n_estimators’类似的参数。XGBClassifier中确实有一个类似的参数,但是,是在标准XGBoost实现中调用拟合函数时,把它作为’num_boosting_rounds’参数传入。

调整参数(含示例)

我已经对这些数据进行了一些处理:

City变量,因为类别太多,所以删掉了一些类别。 DOB变量换算成年龄,并删除了一些数据。 增加了 EMI_Loan_Submitted_Missing 变量。如果EMI_Loan_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的EMI_Loan_Submitted变量。 EmployerName变量,因为类别太多,所以删掉了一些类别。 因为Existing_EMI变量只有111个值缺失,所以缺失值补充为中位数0。 增加了 Interest_Rate_Missing 变量。如果Interest_Rate变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Interest_Rate变量。 删除了Lead_Creation_Date,从直觉上这个特征就对最终结果没什么帮助。 Loan_Amount_Applied, Loan_Tenure_Applied 两个变量的缺项用中位数补足。 增加了 Loan_Amount_Submitted_Missing 变量。如果Loan_Amount_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Loan_Amount_Submitted变量。 增加了 Loan_Tenure_Submitted_Missing 变量。如果 Loan_Tenure_Submitted 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Loan_Tenure_Submitted 变量。 删除了LoggedIn, Salary_Account 两个变量 增加了 Processing_Fee_Missing 变量。如果 Processing_Fee 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Processing_Fee 变量。 Source前两位不变,其它分成不同的类别。 进行了量化和独热编码(一位有效编码)。

如果你有原始数据,可以从资源库里面下载data_preparation的Ipython notebook 文件,然后自己过一遍这些步骤。

首先,import必要的库,然后加载数据。

#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics   #Additional     scklearn functions
from sklearn.grid_search import GridSearchCV   #Perforing grid search

import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4

train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'

注意我import了两种XGBoost:

xgb - 直接引用xgboost。接下来会用到其中的“cv”函数。 XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。

在向下进行之前,我们先定义一个函数,它可以帮助我们建立XGBoost models 并进行交叉验证。好消息是你可以直接用下面的函数,以后再自己的models中也可以使用它。

def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
if useTrainCV:
   xgb_param = alg.get_xgb_params()
   xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
   cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
       metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
   alg.set_params(n_estimators=cvresult.shape[0])

#Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')

#Predict training set:
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]

#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob)

feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')

这个函数和GBM中使用的有些许不同。不过本文章的重点是讲解重要的概念,而不是写代码。如果哪里有不理解的地方,请在下面评论,不要有压力。注意xgboost的sklearn包没有“feature_importance”这个量度,但是get_fscore()函数有相同的功能。

参数调优的一般方法。

我们会使用和GBM中相似的方法。需要进行如下步骤:
1. 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。
2. 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。
3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
4. 降低学习速率,确定理想参数。

咱们一起详细地一步步进行这些操作。

第一步:确定学习速率和tree_based 参数调优的估计器数目。

为了确定boosting 参数,我们要先给其它参数一个初始值。咱们先按如下方法取值:
1、max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。
2、min_child_weight = 1:在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。
3、gamma = 0: 起始值也可以选其它比较小的值,在0.1到0.2之间就可以。这个参数后继也是要调整的。
4、subsample,colsample_bytree = 0.8: 这个是最常见的初始值了。典型值的范围在0.5-0.9之间。
5、scale_pos_weight = 1: 这个值是因为类别十分不平衡。
注意哦,上面这些参数的值只是一个初始的估计值,后继需要调优。这里把学习速率就设成默认的0.1。然后用xgboost中的cv函数来确定最佳的决策树数量。前文中的函数可以完成这个工作。

#Choose all predictors except target & IDcols
predictors = [x for x in train.columns if x not in [target,IDcol]]
xgb1 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb1, train, predictors)

从输出结果可以看出,在学习速率为0.1时,理想的决策树数目是140。这个数字对你而言可能比较高,当然这也取决于你的系统的性能。

注意:在AUC(test)这里你可以看到测试集的AUC值。但是如果你在自己的系统上运行这些命令,并不会出现这个值。因为数据并不公开。这里提供的值仅供参考。生成这个值的代码部分已经被删掉了。<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxoMSBpZD0="第二步-maxdepth-和-minweight-参数调优">第二步: max_depth 和 min_weight 参数调优

我们先对这两个参数调优,是因为它们对最终结果有很大的影响。首先,我们先大范围地粗调参数,然后再小范围地微调。
注意:在这一节我会进行高负荷的栅格搜索(grid search),这个过程大约需要15-30分钟甚至更久,具体取决于你系统的性能。你也可以根据自己系统的性能选择不同的值。

param_test1 = {
'max_depth':range(3,10,2),
'min_child_weight':range(1,6,2)
}
gsearch1 = GridSearchCV(estimator = XGBClassifier(         learning_rate =0.1, n_estimators=140, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8,             colsample_bytree=0.8,
objective= 'binary:logistic', nthread=4,     scale_pos_weight=1, seed=27),
param_grid = param_test1,     scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])
gsearch1.grid_scores_, gsearch1.best_params_,     gsearch1.best_score_

【转】XGBoost参数调优完全指南(附Python代码)

理解 XGBoost 参数### 通用参数 booster(默认 gbtree): 选择每次迭代的模型,可选 gbtree(基于树的模型)或 gbliner(线性模型)。 silent(默认 0): 当值为 1 时,静默模式,不输出任何信息。 nthread(默认最大线程数): 控制多线程,应设置为系统核数,或不设置以自动检测。Booster ...

Load Port、SMIF

威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...

xgboost参数调优

这里通常使用GridSearch。可先寻找max_depth、min_child_weight,确定后,再对gamma、subsample等调优。三. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。四. 降低学习速率,确定理想参数。xgboost 中,objective 是模型学习任务参数(learning task paramet...

干货|XGBoost进阶—调参+实战

首先,XGBoost的参数分为三大类:通用参数、booster参数和学习目标参数。1. 通用参数包括booster选择(默认gbtree,决策树模型优于线性模型gbliner)、silent模式(默认0,开启则无输出,便于理解)、nthread(控制线程数,不设则自动检测)。2. booster参数中,eta(默认0.3)控制学习步长,min_child_weig...

如何对XGBoost模型进行参数调优

通用参数这些参数用来控制XGBoost的宏观功能。1、booster[默认gbtree]选择每次迭代的模型,有两种选择:gbtree:基于树的模型gbliner:线性模型2、silent[默认0]当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。3、nthread[默认值为最大可能的线程数]这...

XGBoost调参

XGBoost调参的关键在于理解其算法流程和参数调整。首先,XGBoost通过DMatrix进行数据封装,这个自定义数据矩阵类有助于优化存储和运算效率。主要参数包括弱评估器(如gbtree、dart或gblinear)参数,如dart的dropout方法相关参数,以及线性评估器的特定任务参数和训练过程。调参时,首要关注正则化参数lambda和alpha,...

XGBoost参数与调优

合理选择任务参数,确保模型聚焦于关键性能指标,对提升模型表现至关重要。综上所述,XGBoost参数的调优需综合考虑模型的基本设定、针对不同Booster类型的优化参数,以及具体学习任务的特定需求。通过精细调参,可在保证模型复杂度的同时,有效提升模型的泛化能力和性能,有效解决过拟合问题。

XGBoost调参

总结而言,XGBoost的调参涉及多方面考量,包括但不限于gamma和min_child_weight等基本参数的设定,以及学习目标参数如early_stopping_rounds的合理配置。通过深入理解参数背后的原理与作用,结合具体问题与数据特性进行调优,可以有效提升模型性能。此外,随着机器学习技术的发展,除XGBoost外,还有LightGBM和CatBoost...

如何对XGBoost模型进行参数调优

XGBoost 允许用户定义自定义优化目标和评价标准 它对模型增加了一个全新的维度,所以我们的处理不会受到任何限制。 4、缺失值处理 XGBoost内置处理缺失值的规则。 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习...

Python 机器学习 XGBoost最优模型构建方法

构建最优XGBoost模型的步骤主要包括数据预处理、参数调优、交叉验证与模型评估。数据预处理是提升模型性能的关键,涉及缺失值处理、特征编码与标准化、以及特征选择。对于缺失值,选择填充策略如中位数、均值或众数等。分类特征应转换为数值型,可通过One-Hot Encoding或Label Encoding完成。数值特征的标准化或...

XGBoost多分类预测

要实现XGBoost多分类预测,首先需要通过Python调用相关包,对模型进行参数调整。这一过程旨在优化模型性能,提升预测准确率。在参数调整方面,常关注的参数包括学习率、树的深度、正则化系数等,合理设置这些参数,对提高模型效果至关重要。同时,还有些参数如最小样本数等,不经常调整,但其合理设置同样影响...

tomcat参数调优 python参数调优 spark参数调优 mysql调优参数 redis参数调优 参数调优 超参数调优 线程池参数 调优 kafka参数调优
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
中国社会问题研究引论目录 释小龙和梁家仁谁的功夫好?? 被洪金宝提携的梁家仁,为何不会功夫却成一代大侠? ...吃多了会热气吗?有什么营养?对皮肤能有什么好处吗?吃多了会影响什么... 带木字旁的休闲公司名字有哪些 投资公司都干什么 如何克服工作的倦怠感? 怎样才能应对工作倦怠? 怎么才能解决工作倦怠? 跳槽和休假有什么区别呢? Lin M是什么品牌 LINCOLN是什么牌子的? 如何让Hadoop结合R语言做大数据分析 hadoop某节点运行较慢,通过什么机制解决 提交作业给Hadoop集群怎么解决 Hadoop 请教学习顺序 如何配置Hadoop守护进程的运行环境和运行参数 求解hadoop的文件夹被移动之后需要改哪些参数? hadoop的mapreduce常见算法案例有几种 hadoop运维的工作内容是什么? 如何构建最优化的Hadoop集群 比Spark快10倍的Hadoop3.0有哪些实用新特性 hadoop 作业为什么使用虚拟内存 如何提升Hadoop MapReduce性能 hadoop MapReduce 读取配置参数 如何对hadoop平台进行优化和维护 什么样的相机可以把腿拉长 oppo下载轻颜相机怎么没有长腿特效? 华为P30拍照和录像有自动拉长腿的功能吗? 什么相机软件拍照可以把腿拍的又细又长 描述一下hadoop中,有那些地方使用了缓存机制,分别有什么作用 Lincoln是什么车?介绍一下… 林肯是什么车 林肯牌的车的标志是什么样的 《逃家少奶奶》最新txt全集下载 请问林肯车是怎么样的 《逃家少奶奶》txt下载在线阅读全文,求百度网盘云资源 《逃家少奶奶》最新章节全文阅读免费下载百度网盘资源,谁有? 求《逃家少奶奶》全本txt完结小说,谢谢~ 求陈小错的《逃家少奶奶》全文 逃家少奶奶33,讲的是什么 谁有陈小错的《逃家少奶奶》全文啊. 逃家少奶奶已经完结了吗? 陈小错的《逃家少奶奶》全文啊.(含VIP部分 719354635@qq.com 求陈小错的《逃家少奶奶》全文阅读。请发至我邮箱,35045044@qq.com!非常感谢! 求现代的比较虐的言情小说,有的亲发下谢谢哦 长期养狗的人会得什么病? 单机模拟人生 模拟人生3资料片的特色 求日本战斗+爱情+热血或者搞笑的动漫最好是完结的