通义灵码2.0实现数据分析小项目
通过某些特征挖掘相关性,构建模型之类的是大学机器学习和python课程常见的题目,今天尝试使用通义灵码2.0实现
图文投稿地址:小红书http://xhslink.com/a/D4BFYLIjaQa6
首先傻瓜式提问怎么开始
这个答案和普通通用大模型不相上下了
接下来拆分需求,逐步开始
提需求,先做数据清洗
# 设置matplotlib字体以支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 自动检测文件编码并读取CSV文件 with open('基础数据.csv', 'rb') as f: result = chardet.detect(f.read()) df = pd.read_csv('基础数据.csv', encoding=result['encoding']) # 打印读取后的数据 print("原始数据:") print(df) # 处理缺失值:删除包含缺失值的行 df.dropna(inplace=True) # 删除第一和第二列(假设是序号和性别) df = df.drop(df.columns[[0, 1]], axis=1) # 处理异常值:使用IQR方法 Q1 = df[['身高', '体重']].quantile(0.25) Q3 = df[['身高', '体重']].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[['身高', '体重']] < (Q1 - 1.5 * IQR)) | (df[['身高', '体重']] > (Q3 + 1.5 * IQR))).any(axis=1)] # 删除含有负数的行 df = df[(df > 0).all(axis=1)] # 打印去除的异常数据的数量 print(f"\n去除的异常数据数量: {len(df) - len(df.dropna())}") # 计算BMI df['BMI'] = df['体重'] / ((df['身高'] / 100) ** 2) # 打印处理后的数据 print("\n处理后的数据:") print(df)
画出对应特征的分布直方图
# 绘制每个特征的分布直方图 num_features = len(df.columns) fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(15, 10)) # 固定大小为15x15 colors = plt.cm.tab10.colors axes = axes.flatten() for ax, column, color in zip(axes, df.columns, colors): ax.hist(df[column], bins=20, edgecolor='k', alpha=0.7, color=color) ax.set_title(f'分布直方图 - {column}') ax.set_xlabel(column) ax.set_ylabel('频数') ax.grid(True) plt.tight_layout() plt.show()
绘制热力图
# 绘制热力图 plt.figure(figsize=(10, 8)) sns.heatmap(pd.DataFrame(X_train, columns=X.columns).corr(), annot=True, cmap='coolwarm', fmt=".2f") plt.title('特征相关性热力图') plt.show()
构建多个模型
# 定义模型 models = { '线性回归': LinearRegression(), '岭回归': Ridge(), '决策树': DecisionTreeRegressor(random_state=42), '随机森林': RandomForestRegressor(random_state=42), '梯度提升': GradientBoostingRegressor(random_state=42), '支持向量机': SVR(), 'K近邻': KNeighborsRegressor() } # 训练和评估模型 results = {} for name, model in models.items(): model.fit(X_train, y_train) y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) results[name] = {'MSE': mse, 'R2': r2} # 交叉验证评估 for name, model in models.items(): scores = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error') print(f"{name} 交叉验证MSE: {-scores.mean()}") # 绘制模型结果对比图表 model_names = list(results.keys()) mse_values = [results[name]['MSE'] for name in model_names] r2_values = [results[name]['R2'] for name in model_names] fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6)) axes[0].bar(model_names, mse_values, color='skyblue') axes[0].set_title('模型均方误差 (MSE)') axes[0].set_xlabel('模型') axes[0].set_ylabel('MSE') axes[0].set_xticklabels(model_names, rotation=45, ha='right') axes[1].bar(model_names, r2_values, color='salmon') axes[1].set_title('模型决定系数 (R2)') axes[1].set_xlabel('模型') axes[1].set_ylabel('R2') axes[1].set_xticklabels(model_names, rotation=45, ha='right') plt.tight_layout() plt.show()
绘制真实值 vs 预测值的散点图
# 绘制真实值 vs 预测值的散点图 plt.figure(figsize=(10, 8)) # 遍历每个模型,绘制真实值 vs 预测值的散点图 for name, model in models.items(): y_pred = model.predict(X_test) # 获取预测值 plt.scatter(y_test, y_pred, alpha=0.5, label=name) # 绘制散点图 # 绘制对角线(理想情况下的预测线) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linestyle='--', linewidth=2, label='理想预测线') # 设置图表标题和标签 plt.title('真实值 vs 预测值', fontsize=16) plt.xlabel('真实值', fontsize=14) plt.ylabel('预测值', fontsize=14) # 添加图例 plt.legend(loc='upper left', fontsize=12) # 显示网格线 plt.grid(True, linestyle='--', alpha=0.6) # 自动调整布局 plt.tight_layout() # 显示图表 plt.show()
构建预测模型
这结果也大致合理,基本上这样就完成了一个非常简单的数据分析,不得不说2.0确实好用,它可以直接帮你改代码,而不用手动的复制粘贴,报错也基本上直接丢个他就能帮你改好。基本上人人都可以是需求,想要什么描述一下,他就能帮你实现