<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Classification on TouchingFish.top</title><link>https://touchingfish.top/tags/classification/</link><description>Recent content in Classification on TouchingFish.top</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 24 Jan 2019 00:00:00 +0000</lastBuildDate><atom:link href="https://touchingfish.top/tags/classification/index.xml" rel="self" type="application/rss+xml"/><item><title>生物序列数据的机器学习预处理</title><link>https://touchingfish.top/2019/bioseq-preprocess/</link><pubDate>Thu, 24 Jan 2019 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2019/bioseq-preprocess/</guid><description>&lt;p&gt;随着生物信息学的快速发展，DNA 序列数据呈爆炸式增长。这些序列蕴含着丰富的生物学信息——然而对处理数值数据的机器学习模型来说，原始的 DNA 序列不过是一串字符，&lt;code&gt;ACGTACG...&lt;/code&gt;，无法直接作为输入。&lt;/p&gt;
&lt;p&gt;将 DNA 序列转化为机器学习模型能够理解的数值矩阵形式，成为一个关键步骤。&lt;/p&gt;
&lt;p&gt;（本文明写 &lt;em&gt;E.Coli&lt;/em&gt; 启动子序列识别，实则记录一种通用的序列转换思路）&lt;/p&gt;
&lt;h2 id="数据预览"&gt;数据预览&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://archive.ics.uci.edu/ml/machine-learning-databases/molecular-biology/promoter-gene-sequences/promoters.data&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Sequence&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Class +
id S10
Sequence \t\ttactagcaatacgcttgcgttcggtggttaagtatgtataat...
Name: 0, dtype: object

 &amp;lt;bound method NDFrame.head of Class id Sequence
0 + S10 \t\ttactagcaatacgcttgcgttcggtggttaagtatgtataat...
1 + AMPC \t\ttgctatcctgacagttgtcacgctgattggtgtcgttacaat...
2 + AROH \t\tgtactagagaactagtgcattagcttatttttttgttatcat...
3 + DEOP2 \taattgtgatgtgtatcgaagtgtgttgcggagtagatgttagaa...
4 + LEU1_TRNA \ttcgataattaactattgacgaaaagctgaaaaccactagaatgc...
.. ... ... ...
101 - 799 \t\tcctcaatggcctctaaacgggtcttgaggggttttttgctga...
102 - 987 \t\tgtattctcaacaagattaaccgacagattcaatctcgtggat...
103 - 1226 \t\tcgcgactacgatgagatgcctgagtgcttccgttactggatt...
104 - 794 \t\tctcgtcctcaatggcctctaaacgggtcttgaggggtttttt...
105 - 1442 \t\ttaacattaataaataaggaggctctaatggcactcattagcc...

[106 rows x 3 columns]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="序列的提取与分割"&gt;序列的提取与分割&lt;/h2&gt;
&lt;p&gt;DataFrame 是由多个 Series 组成的，每个 Series 代表 DataFrame 的一列。&lt;/p&gt;</description></item><item><title>699个名字（机器学习领域的"Hello World"）</title><link>https://touchingfish.top/2019/brca-detection-with-sklearn/</link><pubDate>Mon, 21 Jan 2019 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2019/brca-detection-with-sklearn/</guid><description>&lt;p&gt;打开这个数据集的时候，脑子里突然闪过一个问题：class 那一列里的 2 和 4，分别对应的是&amp;quot;良性&amp;quot;和&amp;quot;恶性&amp;quot;——但这两个数字背后，坐着的是谁？&lt;/p&gt;
&lt;h2 id="699个女人"&gt;699个女人&lt;/h2&gt;
&lt;p&gt;威斯康星乳腺癌数据集（Wisconsin Breast Cancer Dataset），算是机器学习领域的&amp;quot;Hello World&amp;quot;。699个样本，每个样本有10个细胞特征：clump_thickness（结块厚度）、uniform_cell_size（细胞大小均匀性）、uniform_cell_shape（细胞形状均匀性）、marginal_adhesion（边缘黏附力）、single_epithelial_size（单上皮细胞大小）、bare_nuclei（裸核）、bland_chromatin（淡染色质）、normal_nucleoli（正常核仁）、mitoses（核分裂）。&lt;/p&gt;
&lt;p&gt;这些特征听起来抽象，却是病理医生在显微镜下实实在在看过的东西。&lt;/p&gt;
&lt;p&gt;他们在数细胞层数，量细胞直径，看细胞边缘是光滑还是锯齿状，观察细胞核被染成什么颜色。每一个1到10的数字，都是人眼与人脑的判断——是经验的积累，是训练的痕迹。&lt;/p&gt;
&lt;p&gt;数据里的每一行，曾经是一个女人坐在诊室里，等待活检结果。&lt;/p&gt;
&lt;h2 id="细胞的语言"&gt;细胞的语言&lt;/h2&gt;
&lt;p&gt;病理医生看细胞，和我们看人很像。&lt;/p&gt;
&lt;p&gt;看形状——圆润的倾向于良性，畸形的倾向于恶性。看边界——边界清晰的通常良性，黏连在一起的往往恶性。看颜色——染色均匀的相对正常，染色质浓集发黑的令人担忧。&lt;/p&gt;
&lt;p&gt;这不是玄学。是几千例病例训练出来的直觉。&lt;/p&gt;
&lt;p&gt;而机器学习做的事情，简单来说就是：绕过医生的经验，用算法把这些&amp;quot;直觉&amp;quot;数字化、规则化。SVM（Support Vector Machine，支持向量机）在高维空间里找到一条最优分割线，把良性样本和恶性样本分开。KNN（K-Nearest Neighbors，K近邻）则是&amp;quot;物以类聚&amp;quot;——看一个未知样本的5个最近邻居是什么类别，由多数投票决定它属于哪一类。&lt;/p&gt;
&lt;p&gt;KNN 选 K=5，是因为经验发现这个数值通常效果较好。太少容易受噪声影响，太多又会模糊边界。&lt;/p&gt;
&lt;p&gt;SVM 的核函数（kernel）把细胞特征映射到高维空间，在那个空间里，线性不可分的数据变得可以分开。&lt;/p&gt;
&lt;h2 id="10折交叉验证"&gt;10折交叉验证&lt;/h2&gt;
&lt;p&gt;直接用全部数据训练，然后测试，会发生什么？&lt;/p&gt;
&lt;p&gt;模型可能&amp;quot;背住&amp;quot;了训练数据，而不是真的学会了规律。就像考试前背答案，遇到新题就傻眼。&lt;/p&gt;
&lt;p&gt;10折交叉验证（10-fold cross validation）解决的是这个问题。把数据随机分成10份，轮流让9份当训练集、1份当测试集，做10次实验，最后取平均准确率。&lt;/p&gt;
&lt;p&gt;结果是：KNN 96.6%，SVM 96.0%。看起来差不多，但实际上——&lt;/p&gt;
&lt;p&gt;KNN 的标准差是 2.9%，SVM 是 3.3%。KNN 更稳定。&lt;/p&gt;
&lt;p&gt;这意味着什么？KNN 在10次实验里波动较小，SVM 则有时表现更好、有时更差。对于实际部署来说，稳定比偶尔的高分更重要。&lt;/p&gt;
&lt;h2 id="precisionrecall与生命的重量"&gt;Precision、Recall、与生命的重量&lt;/h2&gt;
&lt;p&gt;但准确率（accuracy）不是唯一的指标。在医疗场景下，误诊和漏诊的代价是不同的。&lt;/p&gt;
&lt;p&gt;Precision（精确率）：预测为恶性的样本里，真正是恶性的比例。&lt;/p&gt;
&lt;p&gt;Recall（召回率）：所有恶性样本里，被正确识别出来的比例。&lt;/p&gt;
&lt;p&gt;F1-Score是这两者的调和平均。&lt;/p&gt;
&lt;p&gt;SVM 报告里的 Class 2（良性）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Precision = 1.00：预测良性的，几乎全对&lt;/li&gt;
&lt;li&gt;Recall = 0.95：100个良性里，有5个被误判为恶性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SVM 报告里的 Class 4（恶性）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Precision = 0.90：预测恶性的，10个里有1个其实是良性&lt;/li&gt;
&lt;li&gt;Recall = 1.00：所有恶性都被找到了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于癌症筛查，Recall 更关键。漏诊一个癌症患者，比误诊一个良性肿瘤更危险——后者只需要进一步检查，前者可能延误治疗时机。&lt;/p&gt;</description></item></channel></rss>