【Python】将Pandas中的DataFrame类型转换成Numpy中的array(进行one-hot编码),将数据送进决策树

目录

一、解决的问题

二、关于数据

三、量化定类数据

四、进行one-hot编码(涉及将Pandas中的DataFrame类型转换成Numpy中的array)

五、送进模型,寻找最优深度

六、训练模型并计算模型R2分数


一、解决的问题

1、量化定量数据

2、将Pandas中的DataFrame类型转换成Numpy中的array 并 进行one-hot编码

3、利用GridSearchCV 方法进行最优max_depth参数查找,最后使用R2评分来给模型打分。

4、训练模型并计算R2分数

 

二、关于数据

ps:事先已经进行了一定的处理,只截取一部分,两张图片为一个DataFrame

print(df.head(4))

print(df.info())

 

三、量化定类数据

可以看到'Region','Year','Direction','Renovation','Elevator' 这几个都是定类的非数值型类型,作为模型的输入我们需要将这些非数值量化

因为不是定序类型,使用 one-hot编码 处理定类数据是非常常用的做法,在pandas中可以使用 get_dummies() 方法

df = pd.get_dummies(
                    data=df,
                    columns=['Region','Year','Direction','Renovation','Elevator'],
                    drop_first=False
)

get_dummies()之后的某定类数据是这样的(因为数据较多,所以只展示Elevator和Renovation定类数据)(如Elevator有两个特征值,有电梯和无电梯,所以在对应列就是0或者1)

四、进行one-hot编码(涉及将Pandas中的DataFrame类型转换成Numpy中的array)

one-hot编码可参考这篇博客:https://blog.csdn.net/weixin_40807247/article/details/82793220

也就是我们把这些属于数值列都和起来并转换为array(除了Price,因为我们的目的就是要用其他特征去预测Price)

先把Price提出来,然后删掉,剩下的就是我们要合并的

prices = np.array(df['Price'])

df = df.drop(columns=['Price'],axis=1)

这里有三个合并转换的方法

方法一

features = df.values

方法二

features = np.array(df)

方法三

# 这个方法虽然还是可以实现,但是已经不推荐大家使用,因为在版本会被去除
features = df.as_matrix()

# 输出
FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.
  features = df.as_matrix()

合并转换之后是这样的,就符合模型的输入了。

 

五、送进模型,寻找最优深度

from sklearn.model_selection import train_test_split
# 划分训练集 测试集
features_train, features_test, prices_train, prices_test = train_test_split(features, prices, test_size=0.2,random_state=0)
                                                                          

from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

 # 利用GridSearchCV计算最优解
 # 使用了 KFold 方法减缓过拟合,GridSearchCV 方法进行最优参数自动搜查,最后使用R2评分来给模型打分。

def performance_metric(y_true, y_predict):
"""计算并返回预测值相比于预测值的分数"""
    from sklearn.metrics import r2_score
    score = r2_score(y_true, y_predict)
    return score

def find_bestmodel_params(X, y):
    cross_validator = KFold(100, shuffle=True)
    regressor = DecisionTreeRegressor()
    params = {'max_depth': range(1,100)} # 深度
    scoring_fnc = make_scorer(performance_metric) # 评分机制
    grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc,         
    cv=cross_validator)

    # 基于输入数据 [X,y],进行网格搜索
    grid = grid.fit(X, y)
    return grid.best_estimator_.get_params()['max_depth'] # 返回最优深度

六、训练模型并计算模型R2分数

def fit_model(X, y,best_depth):
        """ 基于输入数据 [X,y],利于网格搜索找到最优的决策树模型"""
        regressor = DecisionTreeRegressor(criterion='mse', max_depth=best_depth,         
           max_features=None,
           max_leaf_nodes=None, min_impurity_decrease=0.0,
           min_impurity_split=None, min_samples_leaf=1,
           min_samples_split=2, min_weight_fraction_leaf=0.0,
           presort=False, random_state=None, splitter='best')
        regressor.fit(X,y)
        # 输出最优模型的 'max_depth' 参数
        print("最理想模型的参数 'max_depth' 是 {} 。".format(regressor.get_params()['max_depth']))
        predicted_value = regressor.predict(features_test)
        r2 = performance_metric(prices_test, predicted_value)
        print("最优模型在测试数据上 R^2 分数 {:,.2f}。".format(r2))

best_depth =  find_best_params(features_train,prices_train)
fit_model(features_train,prices_train,best_depth)

结果:

 

题外话:

1、让人认识数据(业务)

2、让机器认识数据(算法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值