今天是生信星球陪你的第995天
公众号里的文章大多数需要编程基础,如果因为代码看不懂,而跟不上正文的节奏,可以来找我学习,相当于给自己一个新手保护期。我的课程都是循环开课,点进去咨询微信↓
生信分析直播课程(9月30日下一期)
生信新手保护学习小组(10月初下一期)
单细胞陪伴学习小组(10月初下一期)
1.探索数据
import pandas as pd
diabetes_df = pd.read_csv("diabetes_clean.csv")
print(diabetes_df.head())
diabetes_df.describe()
除了第一列表示怀孕次数的可以是0,其他的指标不可能为0,所以其他列是0的行应该是缺失的,这样的行应当去掉。
后面只用到了glucose和bmi列,所以把这两列中的任意一列值为0的行去掉
cols_to_check = diabetes_df.iloc[:, [1,5]]
# 检查这些列中任意一列是否包含0
rows_to_drop = cols_to_check.eq(0).any(axis=1)
# 删除这些行
diabetes_df = diabetes_df[~rows_to_drop]
diabetes_df.shape
## (752, 9)
2.创建特征和目标数据
X = diabetes_df.drop("glucose", axis=1).values
y = diabetes_df["glucose"].values
print(type(X), type(y))
## <class 'numpy.ndarray'> <class 'numpy.ndarray'>
3.根据单一特征完成预测
X_bmi = X[:, 3]
print(y.shape, X_bmi.shape)
## (752,) (752,)
X_bmi = X_bmi.reshape(-1, 1)
print(X_bmi.shape)
## (752, 1)
# 也可以写作
X_bmi = diabetes_df.iloc[:,5].values.reshape(-1,1)
y是一维的没有问题,但X通常是多个特征,所以函数不允许X是一维数组的格式。
我找kimi讲解了一下.reshape(-1, 1) 的作用:
reshape(-1, 1)
是NumPy数组的一个方法,用于改变数组的形状。reshape(-1, 1)
中的-1
表示自动计算这一维的大小,以确保总元素数量不变。这里,它会自动计算出需要多少行,以使得数组的总元素数量与原始数组相同。1
表示新的数组将只有一列。这行代码的作用是将 X_bmi
数组从一维数组转换为二维数组,其中每个元素都在自己的行中,即变为一个列向量。
举个例子,假设X
是这样的数组:
[[ 0.0, 1.0, 2.0, 3.0],
[ 4.0, 5.0, 6.0, 7.0],
[ 8.0, 9.0, 10.0, 11.0]]
执行X_bmi = X[:, 3]
后,X_bmi
将是:
[3. 7. 11.]
然后执行X_bmi = X_bmi.reshape(-1, 1)
后,X_bmi
将变为:
[[ 3.],
[ 7.],
[11.]]
这样,X_bmi
就从一个一维数组变成了一个二维数组,每个元素都在自己的行中。这种转换在机器学习中很常见,因为许多机器学习算法需要输入数据为二维数组的形式(即特征矩阵)。
4.把特征和目标变量画在散点图里
import matplotlib.pyplot as plt
plt.scatter(X_bmi, y)
plt.ylabel("Blood Glucose (mg/dl)")
plt.xlabel("Body Mass Index")
plt.show()
5.拟合线性回归模型并可视化
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_bmi, y)
predictions = reg.predict(X_bmi)
print(predictions[:5]) #查看前五个预测值
## [123.11892469 115.92280307 112.53034574 117.46482913 132.88508973]
plt.scatter(X_bmi, y)
plt.plot(X_bmi, predictions)
plt.ylabel("Blood Glucose (mg/dl)")
plt.xlabel("Body Mass Index")
plt.show()