D代表样本集合;样本集合中数据可以分为k个类别,每个类别的概率为Pi。样本集合中,如果所有的样本均属于同一类别,那么此时“混乱程度”最低,信息熵为0,取到最小值;样本集合中,如果所有类别的样本概率相同,那么此时“混乱程度”最高,信息熵为logk,取到最大值。
逻辑回归虽然带有回归两字,但实际上是做分类任务的,并且是一个经典的二分类算法。在选择使用机器学习算法的时候,通常考虑的就是逻辑回归算法,再去考虑另外复杂的算法,也就是说能用简单的还是用简单的算法。在机器学习中,算法不是越复杂越好,而是要简单、高效、通俗易懂。
逻辑回归其实是一个分类算法而不是回归算法。通常是利用已知的自变量来预测一个离散型因变量的值(像二进制值0/1,是/否,真/假)。简单来说,它就是通过拟合一个逻辑函数(logitfuction)来预测一个事件发生的概率。所以它预测的是一个概率值,自然,它的输出值应该在0到1之间。
逻辑回归算法原理可以概括为以下几个方面:
逻辑回归算法公式为:
假设有N个样本,样本标签只有0和1两类可以用极大似然估计法估计模型参数,从而得到逻辑回归模型。设yi=1的概率为pi, yi=0的概率为1-pi,那么观测的概率为:
概率由逻辑回归的公式求解,那么带进去得到极大似然函数:
最终导数变为:
逻辑回归具有以下优点:
1.形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
2.模型效果好。在工程上是可以接受的,如果特征工程做的好,效果不会太差,并且特征工程可以并行开发,大大加快开发的速度。
3.训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
4.资源占用小,尤其是内存。因为只需要存储各个维度的特征值。
5.方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果。
KNN最邻近分类算法的实现原理为:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
KNN算法的关键:
1.样本的所有特征都要做可比较的量化,若是样本特征中存在非数值的类型,必须采取手段将其量化为数值
2.样本特征要做归一化处理,样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对距离计算的影响不一样,如取值较大的影响力会盖过取值较小的参数。所以样本参数必须做一些scale处理,最简单的方式就是所有特征的数值都采取归一化处置。
3.需要一个距离函数以计算两个样本之间的距离,通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。
神经网络模型是模拟人类神经网络工作原理进行自我学习和演化的一种数据工作方法。神经网络在系统辨识、模式识别、智能控制等领域应用广泛,尤其在智能控制中被视为解决自动控制中控制器适应能力这个难题的关键钥匙之一。
神经网络理论是巨量信息并行处理和大规模平行计算的基础,是高度非线性动力学系统,又是自适应组织系统,可用来描述认知、决策及控制的智能行为.它的中心问题是智能的认知和模拟,更重要的是它具有“认知”、“意识”和“感情”等高级大脑功能。它再一次拓展了计算概念的内涵,使神经计算、进化计算成为新的学科,神经网络的软件模拟得到了广泛的应用。
XGBoost是2014年2月诞生的专注于梯度提升算法的机器学习函数库,此函数库因其优良的学习效果以及高效的训练速度而获得广泛的关注。XGBoost不仅学习效果很好,而且速度也很快,相比梯度提升算法在另一个常用机器学习库scikit-learn中的实现,XGBoost的性能经常有十倍以上的提升。XGBoost算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
在本次系统的开发过程中,首先要先获取到源数据集,根据数据集中的信息对数据进行清洗与降维处理,保证数据的完整性与一致性;在完成数据集的处理后,就可以在PyCharm中设计机器学习算法模型了,本着对患者负责的心态以及保证分析结果的准确性的目的,在系统中设计了多个算法同时进行预测,并进行多维分析验证;最后设计用户主界面,使用户可以在此界面输入个人身体信息,系统会将信息传递到后台的算法模型当中进行分析,最后给出预测结论。
图3.1-1:项目总体设计
在本次系统设计中采用的数据集来自阿里天池数据集,数据来源:https://tianchi.aliyun.com/dataset/dataDetail” />3.3 数据清洗
数据清洗概念就是去重,检查数据一致性,处理无效值和缺失值等,删除重复信息,纠正存在的错误。就是缺失值进行清洗、确定缺失值范围(对每个字段都计算其缺失值比例,然后按照缺失值比例和字段重要性,分别制定策略)、去除不需要的字段(清洗每做一步时都备份一下,或者在小规模数据上试验成功再处理全量数据)填充缺失内容(以业务知识或经验推测填充缺失值、以同一指标的计算结果(均值,中位数,众数等)填充缺失值)、重新取数(如果某些指标非常重要又缺失率高,需要和数据获取人员了解,是否有其他渠道取到相关数据)。
首先将目标数据集导入到程序中,查看数据的基本情况,这里采用了Pandas中的read.csv()方法将数据导入,并打印出数据所有记录。在查看的过程中发现Glucose、BloodPressure、SkinThickness、Insulin、BMI这5个维度存在缺失现象,对于数据的缺失情况,程序中采用了中值补全的方式,将数据的缺失值补全。
图3.3-1:缺失值补全代码展示
在完成补全操作以后,程序中还引入了sklearn中的StandardScaler库对数据进行数据标准化操作,最后将文件保存到电脑上,至此完成数据清洗操作。
图3.3-2:数据标准化代码设计
首先,根据所要根据前面选择的算法挑选第三方库,在这里先要导入numpy、pandas等基础库作为基础支撑,其次随机森林、决策树、逻辑回归、KNN、神经网络算法需要在sklearn中进行引入操作,对于xgboost算法模型则需要单独安装和引入。
在随机森林算法的实现过程中首先算法所需的变量进行赋值,并划分训练集与测试集。由于数据集较小,共有768条记录,所以在这里选取了738条记录作为训练集,30条记录作为测试集。在拿到训练集后需要调用RandomForestClassifier()随机森林分类器对数据进行训练,系统在完成训练后会导入测试集对算法模型进行测试,输出随机森林算法的算法准确率以及对算法预测结构与真实结果之间的对比,给出算法评分,具体代码如图3.4.1-1所示。
图3.4.1-1:随机森林算法代码展示
代码运行后可以看到随机森林算法的准确率在90%左右,具有较高的准确性,应用于糖尿病预警分析中具有良好效果。
图3.4.1-2:随机森林算法结构展示
决策树的代码实现于前面随机森林的设计过程类似,不同之处在于算法训练中使用了DecisionTreeClassifier()决策树分类器,其余部分大同小异本文不再过多赘述,将中心集中于算法所实现的结果展示,决策树代码如图3.4.2-1所示。
图3.4.2-1:决策树代码展示
对于决策树算法最终得分为0.77,从整体上来看算法准确率偏低,在糖尿病的研究中并不适用。
图3.4.2-2:决策树算法实现
就逻辑回归算法的实现结果来看,算法准确率达到了0.93,在算法评级中属于较高的水平,在诊断预测上可以作为重要的参考依据。
图3.4.3-1:逻辑回归算法实现
在KNN算法对数据集的预测分析中,由于无法在一开始就确定K取何值时准确率最高,所以在程序中采用了循环遍历的方式寻找K值,共遍历14次(K值取1-15),如图3.4.4-1所示。
图3.4.4-1:KNN算法程序设计
经过测试以后可以看到KNN算法在K=1时,算法准确率为0.8,为KNN算法在训练中准确率的最小值,如图3.4.4-2所示;而当K=14时,KNN算法的准确率达到了0.9,为KNN算法在训练中的最大值,如图3.4.4-3所示。可见KNN算法准确率受K值影响较大,需要多次进行拟合测试。
图3.4.4.2:k=1时KNN算法准确率
图3.4.4-3:k=14时KNN算法准确率
从图3.4.5-1中可知神经网络模型的准确率为0.77,与决策树算法相差不大。
图3.4.5-1:神经网络算法实现
对于XGBoost算法而言,其算法准确率达到了0.93,如图3.4.6-1所示。XGBoost算法在糖尿病预警分析系统的算法选择以及权重分配上无疑要居于首位。
图3.4.6-1:XGBoost算法结果展示
根据系统需求分析,用户在打开系统界面时,首先要在主界面输入自己的身体信息,系统会检测输入信息,如果出现信息缺失或其他异常因素时,系统会给出提升并让用户重新输入信息。在接收到正确的信息后,系统会将用户信息传递到后台变量上,交给算法模型进行分析,最后给出用户的糖尿病风险情况。
图3.5-1:主程序设计
在系统开发的最后,在程序中追加了糖尿病风险预警程序,当用户输入身体信息,后台算法模型训练结束后,风险预警程序默认为当算法模型给出算法准确率大于0.8时,则认为该用户有患上糖尿病的风险。在系统测试中,选取了源数据集中的第一条数据进行系统测试。
图3.6-1:系统测试
图3.6-2:随机森林算法测试
剩下的大家自己测吧…
由于社会公众缺乏对糖尿病的认识和预防意识,他们不知道如何预防糖尿病,得了糖尿病又不能及时检查和治疗。此外,糖尿病是一种慢性终身性疾病,需要坚持长期的治疗。病因的复杂性、治疗措施的综合性和个体化都需要得到患者的主动参与,提高糖尿病患者的自觉性和主动配合,以达到良好的代谢控制,才能避免和延缓糖尿病慢性并发症的发生与发展,也可降低医疗费用。因此,提取做好糖尿病的筛查与预警尤为重要,本系统基于机器学习算法,为用户提供了一个可以自行筛查糖尿病的预警系统,可以让用户早发现,早治疗,避免诸多糖尿病以及并发症的困扰,提高每一位患者的生活质量。
数据来源:https://tianchi.aliyun.com/dataset/dataDetail” />
一代源代码
# 首先 import 必要的模块import numpy as npimport pandas as pdfrom xgboost import XGBClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neural_network import MLPClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_report, confusion_matrix, accuracy_scorepd.set_option('display.max_rows', 10)pd.set_option('display.max_columns', 10)pd.set_option('display.width', 1000)# 导入csv数据df = pd.read_csv("C:/")# x为可能导致糖尿病的因素x = df.drop('Outcome', axis=1)# y为诊断结果,1为确诊,2为未确诊y = df['Outcome']# 训练数据(随机森林)def random_forest():# 将数据标准化X = df.drop('Outcome', axis=1)# 一共768个数据738个作为训练集,30个作为测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)# 若数值过大可以标准化,这里数值不算大,标准化后准确值较低,所以注释掉了不进行标准化classifier = RandomForestClassifier(criterion='entropy', n_estimators=1000, max_depth=None, min_samples_split=10,min_weight_fraction_leaf=0.02)classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)print('随机森林准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))print('模型得分:{:.2f}'.format(classifier.score(X_test, y_test)))y_ = np.array(y_test)print('随机森林预测结果:', classifier.predict(X_test))print('真实结果: ', y_)print('-------------------------------------------')# 训练数据(决策树)def decision_tree():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768)# 参数是经过测试得到的最高准确率的参数classifier = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_weight_fraction_leaf=0.01)classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)print('决策树准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))print('模型得分:{:.2f}'.format(classifier.score(X_test, y_test)))y_ = np.array(y_test)print('决策树预测结果:', classifier.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')# 训练数据(逻辑回归)def logistic_regression():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)lr = LogisticRegression(random_state=0, max_iter=1000)lr.fit(X_train, y_train)y_pred = lr.predict(X_test)print('逻辑回归准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))print('模型得分:{:.2f}'.format(lr.score(X_test, y_test)))y_ = np.array(y_test)print('逻辑回归预测结果:', lr.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')# 训练数据(KNN)寻找最佳的k值def k_nn():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)error = []# 由于一开始并不清楚K取多少准确率最高,所以写了一个K为1-14的for循环,通过检查误差值来判断最合适的K值for k in range(1, 15):classifier = KNeighborsClassifier(n_neighbors=k)classifier.fit(X_train, y_train)y_prediction = classifier.predict(X_test)error.append(np.mean(y_prediction != y_test))print('当k=', k, '时的准确率')print(confusion_matrix(y_test, y_prediction))print(classification_report(y_test, y_prediction))print('模型得分:{:.2f}'.format(classifier.score(X_test, y_test)))print('--------------------------------------------------------------------------------------')def n_n():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)mlp = MLPClassifier(random_state=0, max_iter=5000)mlp.fit(X_train, y_train)y_pred = mlp.predict(X_test)print('Neural Network准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))print('模型得分:{:.2f}'.format(mlp.score(X_test, y_test)))y_ = np.array(y_test)print('Neural Network预测结果:', mlp.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')def xgb():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)xgb = XGBClassifier(gamma=0, use_label_encoder=False, learning_rate=0.01, max_depth=10, n_estimators=10000, random_state=34, reg_lambda=6, reg_alpha=3, verbosity=0)xgb.fit(X_train, y_train)y_prediction = xgb.predict(X_test)print('XGBoost准确率')print(confusion_matrix(y_test, y_prediction))print(classification_report(y_test, y_prediction))print(accuracy_score(y_test, y_prediction))print('模型得分:{:.2f}'.format(xgb.score(X_test, y_test)))y_ = np.array(y_test)print('XGBoost预测结果:', xgb.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')# 主菜单def main_menu():print('-' * 11, '糖尿病诊断预测', '-' * 11)print('|{:20}|{:20}|'.format('1.输入指标', '2.退出系统'))# 选择模型菜单def option_menu():print('-' * 11, '训练模型选择', '-' * 11)print('|{:20}|{:20}|'.format('1.所有模型', '2.随机森林'))print('|{:20}|{:20}|'.format('3.决策树', '4.逻辑回归'))print('|{:23}|{:20}|'.format('5.KNN', '6.连接模型'))print('|{:23}|'.format('7.XGBoost'))# 登出def logout():print('感谢使用')if __name__ == '__main__':while True:main_menu()key = input('请输入你的选择: ')if key == '1':try:Pregnancy = float(input('输入怀孕指数:'))Glu = float(input('输入葡萄糖指数:'))BP = float(input('输入血压:'))ST = float(input('输入皮肤厚度:'))Ins = float(input('输入胰岛素指数:'))BMI = float(input('输入体质指数:'))DBF = float(input('输入糖尿病谱系功能指数:'))Age = float(input('输入年龄:'))except:print("不符合输入要求,请重新输入")continue# 将输入的值放在一个列表中indices = [Pregnancy, Glu, BP, ST, Ins, BMI, DBF, Age]l = []for index in indices:l.append(index)empty_indices = {"Pregnancies": l[0], "Glucose": l[1], "BloodPressure": l[2], "SkinThickness": l[3], "Insulin": l[4], "BMI": l[5], "DiabetesPedigreeFunction": l[6], "Age": l[7]}data = pd.DataFrame(empty_indices, index=[0])data = data.set_index('Pregnancies')data.to_csv("new.csv")df_1 = pd.read_csv("new.csv")s = df_1.iloc[0]# 选择模型菜单option_menu()option = input('请选择模型:')# 显示所有的训练模型结果if option == '1':random_forest()decision_tree()logistic_regression()k_nn()n_n()xgb()elif option == '2':random_forest()elif option == '3':decision_tree()elif option == '4':logistic_regression()elif option == '5':k_nn()elif option == '6':n_n()elif option == '7':xgb()else:print('无效输入')continueelif key == '2':logout()breakelse:print('无效输入')
改进源代码
import numpy as npimport pandas as pdfrom xgboost import XGBClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neural_network import MLPClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_report, confusion_matrix, accuracy_scorepd.set_option('display.max_rows', 10)pd.set_option('display.max_columns', 10)pd.set_option('display.width', 1000)# 导入csv数据df = pd.read_csv("C:/")# x为可能导致糖尿病的因素x = df.drop('Outcome', axis=1)# y为诊断结果,1为确诊,2为未确诊y = df['Outcome']# 训练数据(随机森林)def random_forest():# 将数据标准化X = df.drop('Outcome', axis=1)# 一共768个数据738个作为训练集,30个作为测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)# 若数值过大可以标准化,这里数值不算大,标准化后准确值较低,所以注释掉了不进行标准化classifier = RandomForestClassifier(criterion='entropy', n_estimators=1000, max_depth=None, min_samples_split=10,min_weight_fraction_leaf=0.02)classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)print('随机森林准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))a = format(classifier.score(X_test, y_test))print(a)if float(a) >= 0.8:print("有糖尿病风险")else:print("无糖尿病风险")y_ = np.array(y_test)print('随机森林预测结果:', classifier.predict(X_test))print('真实结果: ', y_)print('-------------------------------------------')# 训练数据(决策树)def decision_tree():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768)# 参数是经过测试得到的最高准确率的参数classifier = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_weight_fraction_leaf=0.01)classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)print('决策树准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))b = format(classifier.score(X_test, y_test))print(b)if float(b) >= 0.8:print("有糖尿病风险")else:print("无糖尿病风险")print(format(classifier.score(X_test, y_test) = 0.8:print("有糖尿病风险")else:print("无糖尿病风险")y_ = np.array(y_test)print('逻辑回归预测结果:', lr.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')# 训练数据(KNN)寻找最佳的k值def k_nn():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)error = []# 由于一开始并不清楚K取多少准确率最高,所以写了一个K为1-14的for循环,通过检查误差值来判断最合适的K值for k in range(1, 15):classifier = KNeighborsClassifier(n_neighbors=k)classifier.fit(X_train, y_train)y_prediction = classifier.predict(X_test)error.append(np.mean(y_prediction != y_test))print('当k=', k, '时的准确率')print(confusion_matrix(y_test, y_prediction))print(classification_report(y_test, y_prediction))d = format(classifier.score(X_test, y_test))print(d)if float(d) >= 0.8:print("有糖尿病风险")else:print("无糖尿病风险")# 训练数据(Neural Networks)def n_n():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)mlp = MLPClassifier(random_state=0, max_iter=5000)mlp.fit(X_train, y_train)y_pred = mlp.predict(X_test)print('Neural Network准确率')print(confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))print(accuracy_score(y_test, y_pred))e = format(mlp.score(X_test, y_test))print(e)if float(e) >= 0.8:print("有糖尿病风险")else:print("无糖尿病风险")y_ = np.array(y_test)print('Neural Network预测结果:', mlp.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')#训练数据(XGBoost)def xgb():X = df.drop('Outcome', axis=1)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=30 / 768, random_state=0)xgb = XGBClassifier(gamma=0, use_label_encoder=False, learning_rate=0.01, max_depth=10, n_estimators=10000, random_state=34, reg_lambda=6, reg_alpha=3, verbosity=0)xgb.fit(X_train, y_train)y_prediction = xgb.predict(X_test)print('XGBoost准确率')print(confusion_matrix(y_test, y_prediction))print(classification_report(y_test, y_prediction))print(accuracy_score(y_test, y_prediction))f = format(xgb.score(X_test, y_test))print(f)if float(f) >= 0.8:print("有糖尿病风险")else:print("无糖尿病风险")y_ = np.array(y_test)print('XGBoost预测结果:', xgb.predict(X_test))print('真实结果: ', y_)print('--------------------------------------------------------------------------------------')# 主菜单def main_menu():print('-' * 11, '糖尿病诊断预测', '-' * 11)print('|{:20}|{:20}|'.format('1.输入指标', '2.退出系统'))# 选择模型菜单def option_menu():print('-' * 11, '训练模型选择', '-' * 11)print('|{:20}|{:20}|'.format('1.所有模型', '2.随机森林'))print('|{:20}|{:20}|'.format('3.决策树', '4.逻辑回归'))print('|{:23}|{:20}|'.format('5.KNN', '6.连接模型'))print('|{:23}|'.format('7.XGBoost'))# 登出def logout():print('感谢使用')if __name__ == '__main__':while True:main_menu()key = input('请输入你的选择: ')if key == '1':try:Pregnancy = float(input('输入怀孕指数:'))Glu = float(input('输入葡萄糖指数:'))BP = float(input('输入血压:'))ST = float(input('输入皮肤厚度:'))Ins = float(input('输入胰岛素指数:'))BMI = float(input('输入体质指数:'))DBF = float(input('输入糖尿病谱系功能指数:'))Age = float(input('输入年龄:'))except:print("不符合输入要求,请重新输入")continue# 将输入的值放在一个列表中indices = [Pregnancy, Glu, BP, ST, Ins, BMI, DBF, Age]l = []for index in indices:l.append(index)empty_indices = {"Pregnancies": l[0], "Glucose": l[1], "BloodPressure": l[2], "SkinThickness": l[3], "Insulin": l[4], "BMI": l[5], "DiabetesPedigreeFunction": l[6], "Age": l[7]}data = pd.DataFrame(empty_indices, index=[0])data = data.set_index('Pregnancies')data.to_csv("new.csv")df_1 = pd.read_csv("new.csv")s = df_1.iloc[0]# 选择模型菜单option_menu()option = input('请选择模型:')# 显示所有的训练模型结果if option == '1':random_forest()decision_tree()logistic_regression()k_nn()n_n()xgb()elif option == '2':random_forest()elif option == '3':decision_tree()elif option == '4':logistic_regression()elif option == '5':k_nn()elif option == '6':n_n()elif option == '7':xgb()else:print('无效输入')continueelif key == '2':logout()breakelse:print('无效输入')
数据清洗
import numpy as npimport pandas as pdtrain = pd.read_csv("C:/Users/Administrator/Desktop/diabetes.csv")print(train.head())#查看缺失值较多的数据统计NaN_col_names = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']train[NaN_col_names] = train[NaN_col_names].replace(0, np.NaN)print(train.isnull().sum())#中值补充缺实值medians = train.median()train = train.fillna(medians)print(train.isnull().sum())#get labelsy_train = train['Outcome']X_train = train.drop(["Outcome"], axis=1)#用于保存特征工程之后的结果feat_names = X_train.columns# 数据标准化from sklearn.preprocessing import StandardScaler# 初始化特征的标准化器ss_X = StandardScaler()# 分别对训练和测试数据的特征进行标准化处理X_train = ss_X.fit_transform(X_train)#存为csv格式X_train = pd.DataFrame(columns = feat_names, data = X_train)train = pd.concat([X_train, y_train], axis = 1)train.to_csv('C:/Users/Administrator/Desktop/pima-diabetes.csv',index = False,header=True)print(train.head())
看到这里就点个赞吧(@-@)