目录
编辑
介绍
数据处理
配置流水线
分割数据
随机森林模型
模型训练
验证训练集预测集
特征重要性
混淆矩阵
AUC模型
AUC曲线
网格搜索
鸢尾花分类预测是一个典型的机器学习问题,旨在通过鸢尾花的几个特征,比如花瓣和萼片的长度和宽度,来预测鸢尾花属于哪个种类。鸢尾花数据集通常被用作统计分类技术的测试案例,是模式识别领域的一个经典问题。
鸢尾花数据集主要包括三个类别:Setosa、Versicolour和Virginica,每个类别包括50个样本,因此总共有150个样本数据。每个样本的数据包含了四个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),这些特征都是以厘米为单位的测量值。
进行鸢尾花分类预测的步骤通常包括以下几个方面:
数据预处理:包括清洗数据、处理缺失值、特征选择等步骤。选择一个模型:根据问题的特点选择一个合适的机器学习模型,比如逻辑回归、K最近邻(KNN)、支持向量机(SVM)或决策树等。训练模型:使用训练数据(通常是数据集的一部分)来训练选定的机器学习模型。模型评估和验证:用测试数据(数据集的另一部分)来评估模型的性能,并调整模型参数直至获得满意的预测结果。应用模型进行预测:使用训练好的模型对新的鸢尾花样本进行分类预测。鸢尾花分类预测是入门机器学习和数据科学的绝佳案例,因为它的数据集规模适中,而且只涉及到少量的特征,使得新手也能够比较容易地理解问题和处理过程。
data = pd.read_csv('data.csv')
X = data.iloc[:, 1:-1]
y = data.iloc[:, -1]
X = pd.DataFrame(X)
y = pd.DataFrame(y)
print(X)
print(y)
data = pd.read_csv('data.csv'):这行代码读取一个名为'data.csv'的CSV文件,将其内容加载到data这个DataFrame对象中。这个CSV文件包含了鸢尾花数据集,这个数据集可能包含多个特征列,用于描述鸢尾花(如萼片长度、宽度等),最后一列是目标变量,即鸢尾花的品种。
X = data.iloc[:, 1:-1]:这行代码用于选择特征变量。.iloc[:, 1:-1]这部分是基于位置的索引,:表示选择所有行,1:-1则表示选择第二列到倒数第二列的所有列。这里假设数据集的第一列(索引为0的列)不是特征列,可能是数据的编号或者别的非特征信息,因此从第二列开始选择到最后一列之前为特征集X。换言之,这里忽略了第一列和最后一列,仅选择中间的列作为特征变量。
y = data.iloc[:, -1]:这行代码用于选择目标变量。iloc[:, -1]基于位置的索引,:表示选择所有行,-1表示选择最后一列。这里的目标变量是指鸢尾花的品种,存储于最后一列。
X = pd.DataFrame(X):尽管X已经是一个DataFrame对象,这行代码显式地再次将X转换为DataFrame。这可能是为了确保X确实是DataFrame类型,或者是出于清晰表达的目的,但从实际操作的角度来看,这行代码可能是多余的。
y = pd.DataFrame(y):同样的,这行代码将y(目标变量)再次转换为DataFrame类型。和上一行代码类似,这也可能是出于确保数据类型或清晰表达的目的,虽然在大多数情况下可能是不必要的。
之前鸢尾花的特征为0,1,2,3,为了更加清晰了解数据,我们将鸢尾花的真实特征作为映射
X.columns = list(map(lambda x: 'feature' + str(x), X.columns))
cate_cols = []
num_cols = []
dtypes = X.dtypes
for col, dtype in dtypes.items():
if dtype == 'object':
cate_cols.append(col)
else:
num_cols.append(col)
数值型特征
class Num_Encoder(BaseEstimator, TransformerMixin):
def __init__(self, cols=[], fillna=False, addna=False):
self.fillna = fillna
self.cols = cols
self.addna = addna
self.na_cols = []
self.imputers = {}
def fit(self, X, y=None):
for col in self.cols:
if self.fillna:
self.imputers[col] = X[col].median()
if self.addna and X[col].isnull().sum():
self.na_cols.append(col)
print(self.na_cols, self.imputers)
return self
def transform(self, X, y=None):
df = X.loc[:, self.cols]
for col in self.imputers:
df[col].fillna(self.imputers[col], inplace=True)
for col in self.na_cols:
df[col + '_na'] = pd.isnull(df[col])
return df
离散型特征
class Cat_Encoder(BaseEstimator, TransformerMixin):
def __init__(self, cols, max_n_cat=7, onehot_cols=[], orders={}):
self.cols = cols
self.onehot_cols = onehot_cols
self.cats = {}
self.max_n_cat = max_n_cat
self.orders = orders
def fit(self, X, y=None):
df_cat = X.loc[:, self.cols]
for n, c in df_cat.items():
df_cat[n].fillna('NAN', inplace=True)
df_cat[n] = c.astype('category').cat.as_ordered()
if n in self.orders:
df_cat[n].cat.set_categories(self.orders[n], ordered=True, inplace=True)
cats_count = len(df_cat[n].cat.categories)
if cats_count <= 2 or cats_count > self.max_n_cat:
self.cats[n] = df_cat[n].cat.categories
if n in self.onehot_cols:
self.onehot_cols.remove(n)
elif n not in self.onehot_cols:
self.onehot_cols.append(n)
print(self.onehot_cols)
return self
def transform(self, df, y=None):
X = df.loc[:, self.cols]
for col in self.cats:
X[col].fillna('NAN', inplace=True)
X.loc[:, col] = pd.Categorical(X[col], categories=self.cats[col], ordered=True)
X.loc[:, col] = X[col].cat.codes
if len(self.onehot_cols):
df_1h = pd.get_dummies(X[self.onehot_cols], dummy_na=True)
df_drop = X.drop(self.onehot_cols, axis=1)
return pd.concat([df_drop, df_1h], axis=1)
return X
num_pipeline = Pipeline([
('num_encoder', Num_Encoder(cols=num_cols, fillna='median', addna=True)),
])
X_num = num_pipeline.fit_transform(X)
cat_pipeline = Pipeline([
('cat_encoder', Cat_Encoder(cols=cate_cols))
])
X_cate = cat_pipeline.fit_transform(X)
将训练集和预测集按照2:8的比例分割
X = pd.concat([X_num, X_cate], axis=1)
print(X.shape, y.shape)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2022)
print('【训练集】', X_train.shape, y_train.shape)
print('【测试集】', X_test.shape, y_test.shape)
rfc = RandomForestClassifier(n_estimators=100,
criterion='gini',
random_state=2022)
rfc.fit(X_train, y_train)
y_train_pred = rfc.predict(X_train)
y_test_pred = rfc.predict(X_test)
accuracy_train = metrics.accuracy_score(y_train, y_train_pred)
accuracy_test = metrics.accuracy_score(y_test, y_test_pred)
print('训练集的accuracy: ', accuracy_train)
print('测试集的accuracy: ', accuracy_test)
feature_importance = pd.DataFrame(rfc.feature_importances_.reshape(X.shape[1], 1), index=list(X.columns),
columns=['特征重要性'])
print(feature_importance)
confusion_matrix = metrics.confusion_matrix(y_train, y_train_pred)
df_matrix = pd.DataFrame(confusion_matrix, index=['setosa', 'versicolor', 'virginica'], columns=['setosa', 'versicolor', 'virginica'])
print(df_matrix)
y_train_proba = rfc.predict_proba(X_train)
y_test_proba = rfc.predict_proba(X_test)
auc_train = metrics.roc_auc_score(y_train, y_train_proba, multi_class ='ovr')
auc_test = metrics.roc_auc_score(y_test, y_test_proba, multi_class ='ovr')
print('训练集的AUC: ', auc_train)
print('测试集的AUC: ', auc_test)
fpr, tpr, thres = metrics.roc_curve(y_test==1, y_test_proba[:, 1])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(fpr, tpr)
plt.title('ROC曲线')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
rfcmodel = RandomForestClassifier()
param_grid_rfr = {
"n_estimators": np.arange(50, 300, 50),
"min_samples_leaf": np.arange(1, 101, 30),
"max_depth": np.arange(2, 8, 2),
"max_leaf_nodes": np.arange(5, 20, 5)
}
rfcmodel_grid = GridSearchCV(estimator=rfcmodel,
param_grid=param_grid_rfr,
verbose=1,
n_jobs=-1,
cv=2)
rfcmodel_grid.fit(X_train, y_train)
print('【RFR】', rfcmodel_grid.best_score_)
best_modelrfc = RandomForestClassifier(n_estimators=rfcmodel_grid.best_estimator_.get_params()['n_estimators'],
min_samples_leaf=rfcmodel_grid.best_estimator_.get_params()['min_samples_leaf'],
max_depth=rfcmodel_grid.best_estimator_.get_params()['max_depth'],
max_leaf_nodes=rfcmodel_grid.best_estimator_.get_params()['max_leaf_nodes'])
best_modelrfc.fit(X_train, y_train)
y_train_pred = best_modelrfc.predict(X_train)
y_test_pred = best_modelrfc.predict(X_test)
accuracy_train = metrics.accuracy_score(y_train, y_train_pred)
accuracy_test = metrics.accuracy_score(y_test, y_test_pred)
print('训练集的accuracy: ', accuracy_train)
print('测试集的accuracy: ', accuracy_test)
相关知识
鸢尾花、葡萄酒分类数据集
用Python实现简单机器学习模型:以鸢尾花数据集为例
机器学习实战:以鸢尾花数据集分类问题为例
机器学习鸢尾花数据集
BP神经网络鸢尾花红酒数据分类分析与源码实现
鸢尾花数据集可视化与机器学习模型评估
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
【机器学习】基于KNN算法实现鸢尾花数据集的分类
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
[Python机器学习]鸢尾花分类 机器学习应用
网址: python机器学习 鸢尾花分类预测 详细教程 数据集+源码+远程部署 https://m.huajiangbk.com/newsview1842733.html
上一篇: 【机器学习实战入门项目】基于机器 |
下一篇: 基于鸢尾花(iris)数据集的回 |