建模调参

本文介绍了逻辑回归的原理及其与线性回归的区别,强调了sigmoid函数在概率预测中的作用以及梯度下降法在求解参数中的应用。同时,展示了数据分布并提供了实现逻辑回归的代码示例。接着,探讨了决策树的构建过程,包括ID3算法、特征选择标准以及防止过拟合的策略,并给出了实际操作中对数据预处理和模型可视化的步骤。
摘要由CSDN通过智能技术生成

逻辑回归

#逻辑回归
#1.总述:逻辑回归是将数据拟合到一个logit函数中,从而能够完成对事件发生的概率进行预测
#线性回归与逻辑回归:线性回归即对于多维空间中存在的样本点,用特征的线性组合去拟合空间中点的分布和轨迹。线性回归是对连续值结果进行预测如果要进行分类问题
                 #就要借助线性回归+阈值的方式。但实际情况下,分类数据并没有这么精准,出现异常值时,判定阈值就失效了。在这样的场景下,逻辑回归就诞生了。
                 #它的核心思想是,如果线性回归的结果输出是一个连续值,而值的范围是无法限定的,那我们就想办法将这个连续值映射到(0,1)的一个概率值,这个
                 #映射函数就是sigmoid函数
#判定边界:我们认为线性回归的预测函数是一个决策边界,当它大于0或小于0时,逻辑回归模型分别预测不同分类的结果。
#代价函数与梯度下降:
  #通过对判定边界的说明,知道会有合适的参数θ使得θTx=0成为很好的分类判定边界,怎么求得合适的参数呢?
  #代价函数:衡量我们在这组参数下预估的结果和实际结果差距的函数,我们要保证逻辑回归的代价函数为凸函数
  #梯度下降:调整参数使得代价函数取得最小值的最基本方法之一。为了找到最小值点,应该朝着下降速度最快的方向(导函数/偏导方向)迈进,每次迈进一小步,再看看此时的下降最快方向是哪儿,再朝着这个方向迈进,直至最低点 
#查看数据分布

from numpy import loadtxt, where
from pylab import scatter, show, legend, xlabel, ylabel
 
#load the dataset
data = loadtxt('E:/data1.txt', delimiter=',')
 
X = data[:, 0:2]
y = data[:, 2]
 
pos = where(y == 1)#numpy.where(condition,x,y)——若满足condition,输出x,否则输出y
neg = where(y == 0)
scatter(X[pos, 0], X[pos, 1], marker='o', c='b')#https://blog.csdn.net/u012328159/article/details/79446910
scatter(X[neg, 0], X[neg, 1], marker='x', c='r')
xlabel('Feature1/Exam 1 score')
ylabel('Feature2/Exam 2 score')
legend(['Fail', 'Pass'])
show()
#下面我们写好计算sigmoid函数、代价函数、和梯度下降的程序

from numpy import loadtxt, where
from pylab import scatter, show, legend, xlabel, ylabel

#load the dataset
data = loadtxt('E:/data1.txt', delimiter=',')
 
X = data[:, 0:2]
y = data[:, 2]

def sigmoid(X):#sigmoid映射函数
    '''Compute sigmoid function '''
    den =1.0+ e **(-1.0* X)
    gz =1.0/ den
    return gz
def compute_cost(theta,X,y):#代价函数
    '''computes cost given predicted and actual values'''
    m = X.shape[0]#number of training examples
    theta = reshape(theta,(len(theta),1)
    J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta)))))
    grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X))
    #optimize.fmin expects a single value, so cannot return grad
    return J[0][0]#,grad
def compute_grad(theta, X, y):#梯度下降
    '''compute gradient'''
    theta.shape =(1,3)
    grad = zeros(3)
    h = sigmoid(X.dot(theta.T))
    delta = h - y
    l = grad.size
    for i in range(l):
        sumdelta = delta.T.dot(X[:, i])
        grad[i]=(1.0/ m)* sumdelta *-1
    theta.shape =(3,)
    return  grad
   
#使用我们的判定边界对training data做一个预测,然后比对一下准确率
def predict(theta, X):
    '''Predict label using learned logistic regression parameters'''
    m, n = X.shape
    p = zeros(shape=(m,1))
    h = sigmoid(X.dot(theta.T))
    for it in range(0, h.shape[0]):
        if h[it]>0.5:
            p[it,0]=1
        else:
            p[it,0]=0
    return p
#Compute accuracy on our training set
p = predict(array(theta), it)
print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0)
#总结一下逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,
#因此我们设计出了逻辑回归这样一个算法,它的输出结果表征了某个样本属于某类别的概率。
#逻辑回归的成功之处在于,将原本输出结果范围可以非常大的θTX 通过sigmoid函数映射到(0,1),从而完成概率的估测。
#而直观地在二维空间理解逻辑回归,是sigmoid函数的特性,使得判定的阈值能够映射为平面的一条判定边界,当然随着特征的复杂化,判定边界可能是多种多样的样貌,但是它能够较好地把两类样本点分隔开,解决分类问题。
#求解逻辑回归参数的传统方法是梯度下降,构造为凸函数的代价函数后,每次沿着偏导方向(下降速度最快方向)迈进一小部分,直至N次迭代后到达最低点

决策树

#决策树
#ID3: ID3算法的核心是在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树。
#具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;
#再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
#ID3相当于用极大似然法进行概率模型的选择。
#criterion:特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼不纯度,是将来自集合的某种结果随机应用于某一数据项的预期误差率,是一种基于统计的思想。entropy是香农熵,也就是上篇文章讲过的内容,是一种基于信息论的思想。Sklearn把gini设为默认参数,应该也是做了相应的斟酌的,精度也许更高些?ID3算法使用的是entropy,CART算法使用的则是gini。
# splitter:特征划分点选择标准,可选参数,默认是best,可以设置为random。每个结点的选择策略。best参数是根据算法选择最佳的切分特征,例如gini、entropy。random随机的在部分划分点中找局部最优的划分点。默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random”。
# max_features:划分时考虑的最大特征数,可选参数,默认是None。寻找最佳切分时考虑的最大特征数(n_features为总共的特征数),有如下6种情况: 
# 如果max_features是整型的数,则考虑max_features个特征;
# 如果max_features是浮点型的数,则考虑int(max_features * n_features)个特征;
# 如果max_features设为auto,那么max_features = sqrt(n_features);
# 如果max_features设为sqrt,那么max_featrues = sqrt(n_features),跟auto一样;
# 如果max_features设为log2,那么max_features = log2(n_features);
# 如果max_features设为None,那么max_features = n_features,也就是所有特征都用。
# 一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
#当样本数量少但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
# 如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
# 推荐多用决策树的可视化,同时先限制决策树的深度,这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
# 在训练模型时,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
# 决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
# 如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
#对数据进行编码过后,再训练决策树
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.externals.six import StringIO
from sklearn import tree
import pandas as pd
import numpy as np
import pydotplus

if __name__ == '__main__':
    with open('lenses.txt', 'r') as fr:                                        #加载文件
        lenses = [inst.strip().split('\t') for inst in fr.readlines()]        #处理文件
    lenses_target = []                                                        #提取每组数据的类别,保存在列表里
    for each in lenses:
        lenses_target.append(each[-1])

    lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']            #特征标签       
    lenses_list = []                                                        #保存lenses数据的临时列表
    lenses_dict = {}                                                        #保存lenses数据的字典,用于生成pandas
    for each_label in lensesLabels:                                            #提取信息,生成字典
        for each in lenses:
            lenses_list.append(each[lensesLabels.index(each_label)])
        lenses_dict[each_label] = lenses_list
        lenses_list = []
    # print(lenses_dict)                                                        #打印字典信息
    lenses_pd = pd.DataFrame(lenses_dict)                                    #生成pandas.DataFrame
    print(lenses_pd)                                                        #打印pandas.DataFrame
    le = LabelEncoder()                                                        #创建LabelEncoder()对象,用于序列化            
    for col in lenses_pd.columns:                                            #为每一列序列化
        lenses_pd[col] = le.fit_transform(lenses_pd[col])
    print(lenses_pd)  
    
clf = tree.DecisionTreeClassifier(max_depth = 4)                        #创建DecisionTreeClassifier()类
    clf = clf.fit(lenses_pd.values.tolist(), lenses_target)                    #使用数据,构建决策树
    dot_data = StringIO()
    tree.export_graphviz(clf, out_file = dot_data,                            #绘制决策树
                        feature_names = lenses_pd.keys(),
                        class_names = clf.classes_,
                        filled=True, rounded=True,
                        special_characters=True)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    graph.write_pdf("tree.pdf")                                                #保存绘制好的决策树,以PDF的形式存储。

GBDT模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于Python和Scikit-learn库的多属性价格预测建模调参的示例代码。这里使用了随机森林回归模型,你可以根据自己的需求选择其他的模型。 首先,我们需要导入必要的库和数据集: ```python import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split, RandomizedSearchCV # 读取数据集 df = pd.read_csv('data.csv') ``` 然后,我们需要对数据集进行预处理,包括处理缺失值、转换数据类型、划分训练集和测试集等: ```python # 处理缺失值 df = df.dropna() # 转换数据类型 df['age'] = pd.to_numeric(df['age'], errors='coerce') df['mileage'] = pd.to_numeric(df['mileage'], errors='coerce') df['price'] = pd.to_numeric(df['price'], errors='coerce') # 划分训练集和测试集 X = df.drop(['price'], axis=1) y = df['price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 接着,我们需要对模型进行调参。这里我们使用了随机搜索(RandomizedSearchCV)方法来搜索最优的超参数,包括n_estimators(决策树个数)、max_depth(决策树深度)、min_samples_split(内部节点再划分所需最小样本数)等: ```python # 定义模型和超参数搜索空间 rf = RandomForestRegressor() params = { 'n_estimators': [100, 200, 300, 400, 500], 'max_depth': [10, 20, 30, 40, 50], 'min_samples_split': [2, 5, 10, 20, 30] } # 随机搜索最优超参数 random_search = RandomizedSearchCV(rf, param_distributions=params, n_iter=10, cv=5, n_jobs=-1, random_state=42) random_search.fit(X_train, y_train) # 输出最优超参数和训练集上的得分 print('Best Params:', random_search.best_params_) print('Training Score:', random_search.best_score_) ``` 最后,我们使用得到的最优超参数来训练模型,并在测试集上进行评估: ```python # 训练模型 rf = RandomForestRegressor(n_estimators=300, max_depth=30, min_samples_split=2) rf.fit(X_train, y_train) # 在测试集上进行评估 y_pred = rf.predict(X_test) score = rf.score(X_test, y_test) print('Test Score:', score) ``` 至此,我们完成了多属性价格预测建模调参的代码。当然,这只是一个简单的示例,实际应用中需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值