一.数据处理
数据来源https://github.com/wuyimengmaths/data,进行一些简单的数据处理,并用决策树模型进行预测。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 16
from sklearn.model_selection import train_test_split, cross_val_score, cross_validate
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv(r'C:\Users\PC\cpsc330\lectures\data/students.csv') ##自己下载好的文件路径
##df.head() 查看表前几条数据
df.columns = ["meat", "grade", "cilantro"] ##更换表头名
##df.describe() 查看数据整体的描述
scatter = plt.scatter(df["meat"], df["grade"], c=df["cilantro"]=="Yes", cmap=plt.cm.coolwarm);
plt.xlabel("Meat consumption (% days)");
plt.ylabel("Expected grade (%)");
plt.legend(scatter.legend_elements()[0], ["No", "Yes"]);
##df["cilantro"].value_counts() 查看是否吃香菜的情况
X = df[["meat", "grade"]] ##X.head()
y = df["cilantro"] ##y.head()
modelfirst = DecisionTreeClassifier(max_depth=None)
modelfirst.fit(X, y)
scorefirst = modelfirst.score(X, y)
predictionfirst = modelfirst.predict([[50, 50]])
二.一些改进方法
1.将数据源进行去重
#sort_values排序
#drop_duplicates去重meat grade数值都相同的
#reset_index用来重置索引,因为有时候对dataframe做处理后索引可能是乱的
df_nodup = df.sort_values(by="cilantro").drop_duplicates(subset=df.columns[:-1]).reset_index(drop=True)
2.决策树深度这一参数改变对分值的影响
X_nodup = df_nodup[["meat", "grade"]] ##去重后
y_nodup = df_nodup["cilantro"]
max_depths = np.arange(1, 18)
scores = []
##遍历决策树深度的参数
for max_depth in max_depths:
score = DecisionTreeClassifier(max_depth=max_depth).fit(X_nodup, y_nodup).score(X_nodup, y_nodup)
scores.append(score)
plt.plot(max_depths, scores);
plt.xlabel("max depth");
plt.ylabel("accuracy score");
3.使用train_test_split函数拆分数据集
df_train, df_test = train_test_split(df_nodup, random_state=123)
如图,将去重后的数据集 随机 拆分为训练集和测试集。
再拆分,进行训练评估
X_train = df_train[["meat", "grade"]] ##训练集特征
y_train = df_train["cilantro"] ##训练集标签 也叫target
X_test = df_test[["meat", "grade"]] ##测试集特征
y_test = df_test["cilantro"] ##测试集标签 也叫target
model = DecisionTreeClassifier() ##建立决策树模型
model.fit(X_train, y_train); ##以训练集来对模型进行训练
score_train = model.score(X_train, y_train) ## 1.0
score_test = model.score(X_test, y_test) ##0.5
4.过拟合
当对测试数据的得分低于对训练数据的得分,产生过拟合现象,解决这个问题的一个方法是减少决策树的最大深度。
5.交叉验证评估
image.png交叉验证评估模型代码
model_treeone = DecisionTreeClassifier(max_depth=1)
cv_score = cross_val_score(model_treeone, X_train, y_train, cv=4)
cv10_score = cross_val_score(model_treeone, X_train, y_train, cv=10)
网友评论