——个人学习用,不适用于大佬———
虽然以前学过一点python,在Jupiter里练过几行,但都忘记了。今年在朋友的帮助下,下载了pycharm打算好好学习一番,医学小白大战python机器学习。
看了两章西瓜书,先都别管,读取文件试试:一言哥说得先安装pandas:
经过几番尝试,发现得在Anaconda prompt里面写,还得先 activate znr(python环境),再:
pip install pandas
换回python脚本:
import pandas as pd
# 读取Excel文件 ,这里默认打开的是py文件所在的文件夹里的文件
data = pd.read_excel('your_data.xlsx')
#如果是路径
#data = pd.read_excel(r'C:/Users/25475/Documents/your_data.xlsx')
# 查看前几行数据
print(data.head()
好诶学会了。
机器学习大概流程
接下来机器学习:现在我已经读取了数据集,打算用决策树来进行机器学习,我的数据集包含每个样本的姓名年龄疾病史等特征,BBS分数是标记,那我应该如何开展机器学习呢
一言哥:你已经读取了数据集,并且计划使用决策树来进行机器学习。你的数据集包含每个样本的姓名、年龄、疾病史等特征,以及BBS分数作为标记。以下是一个基本的步骤指南,帮助你开展机器学习:
1. 数据预处理
特征选择:
移除与预测目标(BBS分数)不相关的特征,如姓名,因为它通常不包含对预测有用的信息。 检查是否有其他不需要或重复的特征,并进行相应处理。数据清洗:
处理缺失值:检查数据集中是否有缺失值,并决定是删除含有缺失值的样本,还是使用某种方法(如均值、中位数、众数或插值)来填充这些缺失值。 处理异常值:检查并处理数据中的异常值或错误值。特征编码:
对于类别型特征(如疾病史,如果它是文本或分类数据),你需要进行编码,例如使用标签编码(Label Encoding)或独热编码(One-Hot Encoding)。特征缩放(可选):
如果你的特征具有不同的尺度或单位,考虑使用标准化或归一化来缩放特征,以帮助某些算法(如决策树算法通常对此不敏感,但对于某些其他算法如KNN或SVM可能很重要)。2. 划分数据集
将你的数据集划分为训练集和测试集。通常,80%的数据用于训练,20%的数据用于测试。你可以使用train_test_split
函数(来自sklearn.model_selection
)来完成这个操作。
3. 选择并训练模型
选择模型:
使用决策树分类器(如DecisionTreeClassifier
,来自sklearn.tree
)。
训练模型:
使用训练集的数据和标签来训练决策树模型。4. 评估模型
使用测试集来评估模型的性能。常见的评估指标包括准确率、精确率、召回率和F1分数等。你可以使用classification_report
和confusion_matrix
(均来自sklearn.metrics
)来获取这些指标。
5. 模型调优
超参数调优:
使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)来找到决策树的最佳超参数,如最大深度、最小样本分割等。特征重要性:
分析决策树模型给出的特征重要性,以了解哪些特征对预测BBS分数最为关键。6. 预测新数据
一旦你有了满意的模型,就可以使用它来预测新的、未见过的数据了。
示例代码框架
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import GridSearchCV
# 假设你的DataFrame叫df,BBS分数列叫'BBS_score',其他特征列叫'feature1', 'feature2', ...
X = df.drop('BBS_score', axis=1) # 特征集
y = df['BBS_score'] # 目标变量(标记)
# 数据预处理(此处仅作示意,具体步骤需根据数据情况调整)
# ...
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 选择并训练模型
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
# 评估模型
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
# 模型调优(可选)
# param_grid = {...} # 定义要搜索的参数网格
# grid_search = GridSearchCV(clf, param_grid, cv=5)
# grid_search.fit(X_train, y_train)
# best_clf = grid_search.best_estimator_
# 使用最佳模型进行预测和评估(如果进行了调优)
# y_pred_best = best_clf.predict(X_test)
# ...
# 预测新数据
# new_data = ... # 新的、未见过的数据
# predictions = clf.predict(new_data)
数据预处理:
我:数据清洗可以用python做吗?
一言哥:是的,数据清洗完全可以使用Python来完成。Python提供了许多强大的库来帮助你进行数据清洗和处理,其中最常用的是pandas库。pandas库提供了丰富的数据结构和数据分析工具,使得数据清洗变得相对简单和高效。
以下是一些常见的数据清洗任务,以及你可以使用pandas库来完成它们的方法:
处理缺失值: 使用dropna()
函数删除包含缺失值的行或列。
使用fillna()
函数填充缺失值,例如用均值、中位数、众数或特定的值来填充。
处理重复值:
使用drop_duplicates()
函数删除重复的行。
数据转换:
使用astype()
函数转换数据类型。
使用apply()
或applymap()
函数应用自定义函数进行数据转换。
异常值处理:
使用描述性统计或可视化方法识别异常值。
使用条件语句或布尔索引删除或替换异常值。
文本数据清洗:
使用str
方法(如lower()
、strip()
、replace()
等)清洗文本数据。
使用正则表达式进行更复杂的文本处理。
特征编码:
对于分类变量,可以使用LabelEncoder
或factorize()
进行标签编码。
对于多分类变量,可以使用get_dummies()
或OneHotEncoder
进行独热编码。
数据标准化或归一化:
使用scale()
函数或StandardScaler
进行标准化。
使用自定义函数或MinMaxScaler
进行归一化。
以下是一个简单的示例,演示如何使用pandas进行数据清洗:
import pandas as pd
# 假设你有一个包含缺失值和重复值的DataFrame
df = pd.DataFrame({
'A': [1, 2, None, 4, 5, 5],
'B': ['foo', 'bar', 'foo', 'bar', 'foo', None],
'C': [10, 20, 30, 40, 50, 60]
})
# 处理缺失值
df = df.dropna() # 删除包含缺失值的行
# 或者
df['A'] = df['A'].fillna(df['A'].mean()) # 用列A的均值填充缺失值
# 处理重复值
df = df.drop_duplicates() # 删除重复的行
# 数据转换(例如,将列B中的文本转换为小写)
df['B'] = df['B'].str.lower()
# 展示清洗后的数据
print(df)
可供选择的模型(分类问题)
我:我的案例是预防跌倒系统,机器学习通过传感器数据特征推断出跌倒高低风险,是分类问题,那我应该用哪些指标来评估我的模型呢?
常用于二分类问题的机器学习算法包括以下几种:
逻辑回归(Logistic Regression):逻辑回归是一种广义的线性回归分析模型,它利用逻辑函数(通常是Sigmoid函数)将线性回归的预测值转换为概率值,从而解决二分类问题。逻辑回归具有计算效率高、易于理解和实现等优点,常用于预测二分类结果。
支持向量机(Support Vector Machine,SVM):SVM是一种基于统计学习理论的分类方法,它通过寻找一个最优超平面来分隔不同类别的样本。SVM在二分类问题中表现出色,特别是对于高维数据和非线性问题。通过选择合适的核函数,SVM可以处理复杂的分类边界。
决策树(Decision Tree):决策树是一种基于树形结构的分类方法,它通过一系列的条件判断来划分数据,并最终达到分类的目的。决策树具有直观易懂、易于解释的优点,适用于处理具有复杂关联性的数据。
随机森林(Random Forest):随机森林是一种基于决策树的集成学习方法,它通过构建多个决策树并综合它们的预测结果来提高分类性能。随机森林能够处理高维数据,具有较好的抗噪能力和泛化性能。
K近邻(K-Nearest Neighbors,KNN):KNN算法通过计算待分类样本与训练集中样本的距离,找到与其最近的K个邻居,然后根据这K个邻居的类别进行投票,从而确定待分类样本的类别。KNN算法简单直观,无需显式训练过程,但计算量较大,对样本分布敏感。
朴素贝叶斯(Naive Bayes):朴素贝叶斯分类器基于贝叶斯定理和特征条件独立假设进行分类。它假设特征之间是相互独立的,从而简化计算过程。朴素贝叶斯分类器在文本分类和某些传感器数据分类问题中表现良好。
在选择二分类问题的机器学习算法时,需要根据数据的特性、问题的复杂度、模型的可解释性以及计算效率等方面进行综合考虑。通常,可以尝试多种算法,并通过交叉验证等方式评估它们的性能,以找到最适合特定问题的模型。
评价模型的指标
对于您的预防跌倒系统的案例,由于您正在处理一个分类问题(推断跌倒的高低风险),以下是一些建议的评估指标,这些指标可以帮助您全面评估模型的性能:
准确率(Accuracy):这是分类问题中最常用的指标之一,它表示模型正确分类的样本占总样本的比例。然而,对于不平衡的数据集(例如,跌倒高风险和低风险的样本数量差异很大),准确率可能不是一个很好的指标,因为它可能会被多数类所主导。
混淆矩阵(Confusion Matrix):这是一个非常有用的工具,可以展示模型分类的详细结果。通过混淆矩阵,您可以得到真正例(TP)、假正例(FP)、真反例(TN)和假反例(FN)的数量,从而进一步计算其他指标。
精确率(Precision):对于跌倒高风险这一类别,精确率表示模型预测为高风险的样本中真正为高风险的比例。这有助于了解模型在预测高风险时的准确性。
召回率(Recall):召回率(也称为真正率)表示实际为跌倒高风险的样本中被模型正确预测为高风险的比例。这反映了模型在识别真正高风险样本上的能力。
F1 分数(F1 Score):F1 分数是精确率和召回率的调和平均值,它提供了一个综合评估模型在精确性和召回率上的性能的指标。
AUC-ROC(Area Under the Curve - Receiver Operating Characteristic):ROC 曲线显示了不同分类阈值下真正率(TPR)和假正率(FPR)之间的关系,而 AUC-ROC 是 ROC 曲线下的面积。AUC-ROC 值越接近 1,说明模型的性能越好。
特异性(Specificity):对于跌倒低风险这一类别,特异性表示模型正确识别低风险样本的能力,即实际为低风险的样本中被模型预测为低风险的比例。
在评估模型时,建议您首先查看混淆矩阵以了解模型的详细分类结果,然后结合精确率、召回率、F1 分数和 AUC-ROC 等指标来全面评估模型的性能。这些指标可以帮助您了解模型在不同方面的表现,从而做出更准确的评估。同时,根据您的具体需求和数据集特点,您还可以考虑其他评估指标或进行进一步的模型优化。