Module 10: 机器学习与 LLM API
从 Scikit-learn 到大语言模型 —— 探索 Python 的前沿应用
本章概览
本章将带你进入 Python 最激动人心的领域:机器学习和大语言模型(LLM)API。你将学习使用 Scikit-learn 构建预测模型,了解深度学习基础,并掌握调用 OpenAI、Anthropic、DeepSeek 等 LLM API 的实用技能。
重要提示:本章内容较为前沿,但对社科研究有巨大应用潜力(文本分析、内容分类、数据标注等)。建议在掌握 Module 9 后学习。
学习目标
学完本章后,你将能够:
- 理解机器学习的基本概念
- 使用 Scikit-learn 构建预测模型
- 了解深度学习和神经网络基础
- 调用 OpenAI GPT API 进行文本分析
- 使用 LLM 进行情感分析、文本分类
- 批量处理文本数据
- 在研究中应用 LLM 技术
章节内容
01 - Scikit-learn 基础
核心问题: 如何用 Python 做机器学习?
核心内容:
- 什么是机器学习?
- 监督学习:回归(预测数值)、分类(预测类别)
- 非监督学习:聚类、降维
- Scikit-learn:Python 最流行的机器学习库
- 线性回归示例:python
from sklearn.linear_model import LinearRegression # 准备数据 X = df[['education', 'age']] # 特征 y = df['income'] # 目标变量 # 训练模型 model = LinearRegression() model.fit(X, y) # 查看系数 print(model.coef_) # [5000, 1200] print(model.intercept_) # 20000 # 预测 predictions = model.predict([[16, 30]]) # education=16, age=30 - 分类模型(Logistic 回归):python
from sklearn.linear_model import LogisticRegression # 预测是否高收入 X = df[['education', 'age']] y = (df['income'] > 80000).astype(int) # 0 或 1 model = LogisticRegression() model.fit(X, y) # 预测概率 proba = model.predict_proba([[16, 30]])[0, 1] # P(高收入) - 模型评估:python
from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 训练 model.fit(X_train, y_train) # 评估 y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) rmse = mean_squared_error(y_test, y_pred, squared=False) - 对比 Stata:
- Stata:
reg income education age - Python:
LinearRegression().fit(X, y) - 区别:Scikit-learn 更侧重预测,Stata 更侧重推断
- Stata:
为什么重要?
- 机器学习是预测和分类的强大工具
- 社科应用:预测行为、文本分类、推荐系统
- 与传统计量的互补
02 - 深度学习入门
核心问题: 什么是深度学习?
核心内容:
- 深度学习 vs 传统机器学习:
- 传统 ML:手工设计特征
- 深度学习:自动学习特征(神经网络)
- 神经网络基础:
- 层(Layer):输入层、隐藏层、输出层
- 激活函数:ReLU、Sigmoid
- 反向传播:如何训练网络
- PyTorch 简介:python
import torch import torch.nn as nn # 定义简单神经网络 class SimpleNN(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(2, 10) # 输入层 → 隐藏层 self.fc2 = nn.Linear(10, 1) # 隐藏层 → 输出层 def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x - Hugging Face Transformers:
- 预训练模型:BERT、GPT、LLaMA
- 用途:文本分类、情感分析、翻译
pythonfrom transformers import pipeline # 情感分析 classifier = pipeline("sentiment-analysis") result = classifier("This product is amazing!") # [{'label': 'POSITIVE', 'score': 0.99}]
社科应用:
- 文本情感分析
- 新闻主题分类
- 社交媒体内容检测
- 图像识别(抗议人群估计)
重要提示:深度学习需要 GPU 和大量数据,社科学生通常调用预训练模型而非从头训练。
03 - LLM API 快速使用
核心问题: 如何调用 GPT、Claude 等大模型?
核心内容:
- 为什么社科学生要学 LLM API?
- 文本数据分析(新闻、社交媒体、访谈)
- 内容分类和编码
- 文献总结和综述
- 问卷设计助手
- 数据清洗和标注
- OpenAI API:python
from openai import OpenAI client = OpenAI(api_key='your-api-key') response = client.chat.completions.create( model="gpt-5", messages=[ {"role": "system", "content": "你是数据分析助手"}, {"role": "user", "content": "解释什么是回归分析"} ] ) print(response.choices[0].message.content) - Anthropic Claude API:python
import anthropic client = anthropic.Anthropic(api_key='your-api-key') message = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=1024, messages=[ {"role": "user", "content": "分析这段文本的情感"} ] ) - DeepSeek API(国产,便宜):python
from openai import OpenAI # DeepSeek 兼容 OpenAI SDK client = OpenAI( api_key='your-deepseek-key', base_url='https://api.deepseek.com' )
实战案例:
案例 1:批量情感分析:
def analyze_sentiment(text):
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "情感分析专家。回答:正面、负面或中性"},
{"role": "user", "content": f"分析:{text}"}
]
)
return response.choices[0].message.content
# 批量分析评论
reviews = df['comment'].tolist()
sentiments = [analyze_sentiment(r) for r in reviews]
df['sentiment'] = sentiments案例 2:文本分类:
def classify_news(text, categories):
prompt = f"""
将以下新闻分类到这些类别之一:{', '.join(categories)}
新闻:{text}
只返回类别名称。
"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
# 批量分类
categories = ['政治', '经济', '社会', '文化']
df['category'] = df['content'].apply(lambda x: classify_news(x, categories))案例 3:结构化数据提取:
def extract_info(text):
prompt = f"""
从以下文本提取信息,返回 JSON 格式:
- name: 人名
- age: 年龄
- occupation: 职业
文本:{text}
"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return json.loads(response.choices[0].message.content)
# 批量提取
infos = [extract_info(text) for text in df['biography']]
df_info = pd.DataFrame(infos)成本和效率:
- GPT-4o-mini:约 $0.001/1K tokens(便宜)
- GPT-5:约 $0.03/1K tokens(贵但更准)
- DeepSeek:约 GPT 价格的 1/10(国产替代)
- 批量处理:使用
ThreadPoolExecutor并发调用
传统计量 vs 机器学习 vs LLM
| 维度 | 传统计量 (Stata) | 机器学习 (Scikit-learn) | LLM (GPT/Claude) |
|---|---|---|---|
| 目标 | 因果推断、解释 | 预测 | 文本理解、生成 |
| 输出 | 系数、p 值 | 预测值、准确率 | 文本、分类、标签 |
| 数据量 | 小样本也可以 | 需要中大样本 | 零样本/少样本学习 |
| 可解释性 | 高 | 中 | 低 |
| 适用场景 | 论文发表 | 预测建模 | 文本分析、内容生成 |
互补使用策略:
- 探索性分析:LLM 快速分类和标注
- 预测建模:机器学习构建预测器
- 因果推断:传统计量(DID、RDD、IV)
- 论文发表:传统计量为主,ML/LLM 为辅
如何学习本章?
学习路线
第 1-2 天(4小时): Scikit-learn 基础
- 阅读 01 - Scikit-learn 基础
- 练习线性回归和 Logistic 回归
- 理解训练集/测试集划分
第 3 天(2小时): 深度学习入门
- 阅读 02 - 深度学习入门
- 了解神经网络概念
- 尝试 Hugging Face pipeline
第 4-5 天(6小时): LLM API
- 阅读 03 - LLM API 快速使用
- 注册 OpenAI/DeepSeek 账号
- 实现文本分类和情感分析
- 批量处理真实数据
总时间: 12 小时(1 周)
最小化学习路径
对于社科学生,优先级如下:
必学(实用技能,6小时):
- 03 - LLM API 快速使用(完整学习)
- 情感分析和文本分类
- 批量处理技巧
重要(扩展视野,4小时):
- 01 - Scikit-learn 基础(线性回归、Logistic)
- 理解预测 vs 推断的区别
可选(深入探索):
- 02 - 深度学习入门
- Fine-tuning 预训练模型
- Prompt Engineering 技巧
学习建议
LLM 是社科学生的"超级助手"
- 文本分类:手工编码 1000 篇需要几周,LLM 几小时
- 情感分析:传统方法需要训练模型,LLM 直接调用
- 数据清洗:LLM 可以理解非结构化文本
注意 LLM 的局限性
- 不能用于因果推断(仍需 DID、IV 等方法)
- 可能有偏见(训练数据的偏见)
- 需要验证(不要盲目信任 LLM 输出)
- 最佳实践:LLM 标注 + 人工抽样验证
成本控制
- 开发阶段用 GPT-3.5-Turbo(便宜)
- 生产阶段考虑 DeepSeek(更便宜)
- 批量处理时设置最大 token 限制
- 缓存重复请求的结果
实践项目:新闻情感分析流水线
pythonimport pandas as pd from openai import OpenAI from tqdm import tqdm client = OpenAI(api_key='your-key') def analyze_sentiment(text): try: response = client.chat.completions.create( model="gpt-3.5-turbo", max_tokens=10, messages=[ {"role": "system", "content": "情感分析。回答:正面/负面/中性"}, {"role": "user", "content": text} ] ) return response.choices[0].message.content.strip() except Exception as e: print(f"错误: {e}") return "未知" # 读取数据 df = pd.read_csv('news.csv') # 批量分析(带进度条) sentiments = [] for text in tqdm(df['content']): sentiment = analyze_sentiment(text) sentiments.append(sentiment) df['sentiment'] = sentiments # 保存结果 df.to_csv('news_with_sentiment.csv', index=False) # 统计 print(df['sentiment'].value_counts())
常见问题
Q: 机器学习能替代传统计量吗? A: 不能。两者目标不同:
- 机器学习:预测("这个用户会点击广告吗?")
- 传统计量:因果推断("广告导致了多少购买?")
- 论文发表仍以传统计量为主
Q: LLM API 很贵吗? A:
- GPT-3.5-Turbo:1000 条短文本约 $1-2(很便宜)
- GPT-5:1000 条约 $30(贵)
- DeepSeek:GPT 价格的 10%(国产替代)
- 学术研究的文本量,成本通常 <$100
Q: LLM 标注准确吗?能用于论文吗? A:
- 准确率:通常 80-95%(取决于任务)
- 最佳实践:LLM 标注 + 人工验证(抽样 10-20%)
- 顶刊接受度:越来越多论文使用 LLM 辅助标注
- 必须说明:在方法部分解释 LLM 使用和验证流程
Q: 需要 GPU 吗? A:
- 不需要(调用 API)
- 只有训练大模型才需要 GPU
- 社科学生 99% 情况是调用 API,不训练模型
Q: 如何选择 LLM API? A:
- 开发/测试:GPT-3.5-Turbo(快且便宜)
- 高质量需求:GPT-5 或 Claude-3.5-Sonnet
- 预算有限:DeepSeek(国产,便宜)
- 中文优先:DeepSeek、通义千问、文心一言
下一步
完成本章后,你将掌握:
- 使用 Scikit-learn 构建预测模型
- 了解深度学习和神经网络基础
- 调用 OpenAI/Claude/DeepSeek API
- 批量处理文本数据(情感分析、分类)
- 在社科研究中应用 LLM 技术
在 Module 11 中,我们将学习代码规范、调试和 Git 版本控制,让你的代码更专业。
LLM 正在改变社科研究!掌握这项技能,让你的研究如虎添翼!