目录
四、进行one-hot编码(涉及将Pandas中的DataFrame类型转换成Numpy中的array)
一、解决的问题
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、让机器认识数据(算法)